Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выводит одинаковые записи вместо разных 
V
    Опции темы
R.M.
Дата 2.2.2006, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Анархист
****


Профиль
Группа: Участник
Сообщений: 2164
Регистрация: 8.6.2005
Где: Питер

Репутация: 0
Всего: 30



Пишу такой код
Код

<?
include("mysql.php");

$sel = mysql_query("SELECT * FROM rus WHERE cat = '2' GROUP BY razdel");

while($row = mysql_fetch_assoc($sel))
  {
  echo "".$row['razdel']."<br>";

  $sel_in = mysql_query("SELECT * FROM rus WHERE cat = '2' AND razdel = '".$row['razdel']."'");

  while($row_in = mysql_fetch_assoc($sel_in))
    {
    echo "&nbsp;&nbsp;".$row['rus']."<br>";
    }

}
?>


Должен выводить так:

Категория 1
Запись 1
Запись 2
Категория 2
Запись 1
Запись 2

и т.п., а выводит так:

Категория 1
Запись 1
Запись 1
Категория 2
Запись 1
Запись 1

В чём ошибка?


--------------------
Помнишь как бодрили дискотеки прошлого века? Теперь стул, компьютер и нету человека.

Nokia LifeStyle - Всё для смартфонов Nokia 
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 3.2.2006, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



Код
    echo "&nbsp;&nbsp;".$row['rus']."<br>";

$row_in наверное надо.

А вообще, я сторонник того, чтобы не выполнять каждый раз запрос, а сначала все загрузить в единый массив, а потом его мучить.
PM ICQ   Вверх
R.M.
Дата 3.2.2006, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Анархист
****


Профиль
Группа: Участник
Сообщений: 2164
Регистрация: 8.6.2005
Где: Питер

Репутация: 0
Всего: 30



Mal Hack
Цитата(Mal Hack @ 3.2.2006, 02:06 Найти цитируемый пост)

$row_in наверное н

Точно, спасибо.
Цитата(Mal Hack @ 3.2.2006, 02:06 Найти цитируемый пост)

А вообще, я сторонник того, чтобы не выполнять каждый раз запрос, а сначала все загрузить в единый массив, а потом его мучить.

Мне както удобнее наоборот smile но надо попробовать и как ты говорил в соседнем топике, хотя думаю разницы особой нет


--------------------
Помнишь как бодрили дискотеки прошлого века? Теперь стул, компьютер и нету человека.

Nokia LifeStyle - Всё для смартфонов Nokia 
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 3.2.2006, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



Цитата(Куксикус @ 3.2.2006, 01:29 Найти цитируемый пост)

Мне както удобнее наоборот smile

МНе мож удобно, как в Асме с каждым регистром работать...

Твой подход не рационален с точки зрения времени работы и ресурсоемкости.
PM ICQ   Вверх
-=Ustas=-
Дата 4.2.2006, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 17
Всего: 69



Цитата(Куксикус @ 2.2.2006, 23:31 Найти цитируемый пост)

Должен выводить так:

Категория 1
Запись 1
Запись 2
Категория 2
Запись 1
Запись 2

По-моему, здесь лучше и гораздо рациональнее будет пробежаться рекурсивно.


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
smartov
Дата 4.2.2006, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 2
Всего: 259



Mal Hack
Цитата(Mal Hack @ 3.2.2006, 11:29 Найти цитируемый пост)

Твой подход не рационален с точки зрения времени работы и ресурсоемкости.


Глупости. Наоборот такой подход будет работать быстрее, если база (как в 99% случаев) расположена на том же хосте, что и скрипты.
PM MAIL   Вверх
Bikutoru
Дата 4.2.2006, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 2
Всего: 22



Строка 14:
Код

    echo "&nbsp;&nbsp;".$row['rus']."<br>";

хотя по логике должно быть
Код

    echo "&nbsp;&nbsp;".$row_in['rus']."<br>";

ИМХО
Код

$sqlRes = mysql_query("SELECT * FROM rus WHERE cat = '2' ORDER BY razdel");
$lastRazdel = null;
while ($row = mysql_fetch_assoc($sqlRes)) {
    if ($lastRazdel !== $row['razdel']) {
        print $row['razdel']."<br>";
        $lastRazdel = $row['razdel']
    }
    
    echo "&nbsp;&nbsp;".$row['rus']."<br>";
}

такой код будет работать побыстрее, чем твой при большом количестве записей...
Цитата(smartov @ 4.2.2006, 12:41 Найти цитируемый пост)

Глупости. Наоборот такой подход будет работать быстрее, если база (как в 99% случаев) расположена на том же хосте, что и скрипты.

Т.е. ты хочешь сказать, что если в таблице несколько тысяч разделов записей, то эти несколько тысяч запросов к базе будут работать быстрее одного запроса, который возвращает все эти записи??? Очень сильно сомневаюсь...


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
smartov
Дата 4.2.2006, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 2
Всего: 259



Bikutoru
Цитата(Bikutoru @ 4.2.2006, 11:32 Найти цитируемый пост)
эти несколько тысяч запросов к базе будут работать быстрее одного запроса, который возвращает все эти записи?

Неверное понимание. Эти несколько тысяч запросов будут работать во много раз быстрее чем несколько тысяч array_filter-ов, которые придется применять при нормальной организации базы при выводе дерева элементов. П.С. Фраза моя была ответом на фразу
Цитата(Mal Hack @ 3.2.2006, 00:06 Найти цитируемый пост)
А вообще, я сторонник того, чтобы не выполнять каждый раз запрос, а сначала все загрузить в единый массив, а потом его мучить.


А организация базы, как у товарища Куксикус, где каждой у записи в поле razdel вместо id раздела написано его имя(!!) smile это дурдом! О чем ему и стоит задуматься.
PM MAIL   Вверх
Mal Hack
Дата 4.2.2006, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



Цитата(smartov @ 4.2.2006, 11:41 Найти цитируемый пост)

Глупости. Наоборот такой подход будет работать быстрее, если база (как в 99% случаев) расположена на том же хосте, что и скрипты.

Да? Ты бы для начала хоть тестирование провел...
Нет, я не спорю, что на каких-то задачах выгоднее сделать много маленьких запросов, чем отом шерстить один большой. Но таких задач меньше, точнее они редко ставятся.
Цитата(smartov @ 4.2.2006, 13:27 Найти цитируемый пост)

ти несколько тысяч запросов будут работать во много раз быстрее чем несколько тысяч array_filter-ов

А где ты там видел, чтобы я упоминал про фильтры?

Запросы к базе это внешние операции, которые в большинстве случаев будут выполняться намного дольше, чем внутрескриптовые конструкции.

Модератор: за хамский тон по отношению к участникам в следующий раз буду кирпич вешать.
PM ICQ   Вверх
R.M.
Дата 6.2.2006, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Анархист
****


Профиль
Группа: Участник
Сообщений: 2164
Регистрация: 8.6.2005
Где: Питер

Репутация: 0
Всего: 30



Цитата(smartov @ 4.2.2006, 14:27 Найти цитируемый пост)

А организация базы, как у товарища Куксикус, где каждой у записи в поле razdel вместо id раздела написано его имя(!!) smile это дурдом! О чем ему и стоит задуматься.

С чего ты взял что у меня нет id ?

Mal Hack

Чтобы сначала всё засунуть в переменную а потом это выводить за циклом нужен ещё один цикл для вывода или я неправильно тебя понял? Привиди пожалуйста пример
Добавлено @ 12:52
Кстати насчёт кирпичей... а куда мой пропал? smile нет я конечно не против но просто интересно


--------------------
Помнишь как бодрили дискотеки прошлого века? Теперь стул, компьютер и нету человека.

Nokia LifeStyle - Всё для смартфонов Nokia 
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 6.2.2006, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



Цитата(Куксикус @ 6.2.2006, 12:49 Найти цитируемый пост)

Чтобы сначала всё засунуть в переменную а потом это выводить за циклом нужен ещё один цикл для вывода или я неправильно тебя понял? Привиди пожалуйста пример

Ты должен делать что-то вроде:
Код
<?
include("mysql.php");
$sel = mysql_query("SELECT * FROM rus WHERE cat = '2' GROUP BY razdel");
$sel_in = mysql_query("SELECT * FROM rus WHERE cat = '2' ORDER BY razdel");
  while($row_in = mysql_fetch_assoc($sel_in))
{ $ri[] = $row_in; }


while($row = mysql_fetch_assoc($sel))
  {
  echo "".$row['razdel']."<br>";
  $sel_in = mysql_query("SELECT * FROM rus WHERE cat = '2' AND razdel = '".$row['razdel']."'");
  while(.....)
    {
    echo "&nbsp;&nbsp;".$ri['rus']."<br>";
    }
}
?>


Там где .... Надо сделать условие, для вывода инфы от нужной категории.. Тут ИМХО if надо будет еще юзать.
PM ICQ   Вверх
smartov
Дата 6.2.2006, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 2
Всего: 259



Цитата(Куксикус @ 6.2.2006, 11:49 Найти цитируемый пост)
С чего ты взял что у меня нет id ?

Так исходя из
Цитата(Куксикус @ 2.2.2006, 22:31 Найти цитируемый пост)

Код

$sel = mysql_query("SELECT * FROM rus WHERE cat = '2' GROUP BY razdel");
....
echo "".$row['razdel']."<br>";


Который должен отображать
Цитата(Куксикус @ 2.2.2006, 22:31 Найти цитируемый пост)
Категория 1

"Категория 1" на id не очень похожа smile Если бы был id выводилось бы соответственно просто "1", верно?


Цитата(Mal Hack @ 4.2.2006, 14:50 Найти цитируемый пост)
Да? Ты бы для начала хоть тестирование провел...

О, поверь. Я с этим намахался много в свое время. И тестирование проводил еще как.

Цитата(Mal Hack @ 4.2.2006, 14:50 Найти цитируемый пост)
Запросы к базе это внешние операции, которые в большинстве случаев будут выполняться намного дольше, чем внутрескриптовые конструкции.

Про большинство случаев - совершенно верно.
Но при случае фильтрования (выбрать записи которые входят в раздел) то обращение к базе ("select * ... where razdel_id=....") будет куда быстрее чем выбирать эти записи "внутрескриптовыми конструкциями" из массива всех записей, считаных предварительно. Именно то что предложил ты.

Цитата(Mal Hack @ 6.2.2006, 13:29 Найти цитируемый пост)
Надо сделать условие, для вывода инфы от нужной категории.. Тут ИМХО if надо будет еще юзать.

Твой код + как ты говришь если if заюзать - вот это и будет работать медленее. И чем больше будет записей тем больше будет разница. (Повторюсь - при условии того что mysql база находится на localhost по отношению к скриптам)
PM MAIL   Вверх
Mal Hack
Дата 6.2.2006, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



smartov спорить не буду, у меня тесты показывали другое.
Да и один запрос к БД всегда лучше, чем много маленьких (в большинстве, опять же)
PM ICQ   Вверх
R.M.
Дата 7.2.2006, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Анархист
****


Профиль
Группа: Участник
Сообщений: 2164
Регистрация: 8.6.2005
Где: Питер

Репутация: 0
Всего: 30



smartov
Цитата(smartov @ 6.2.2006, 16:27 Найти цитируемый пост)

"Категория 1" на id не очень похожа smile Если бы был id выводилось бы соответственно просто "1", верно?

А ты не думал что поле в котором хранятся id может называться id а не раздел и переменная $row['razdel'] выводит название раздела а не id или ты во всех своих скриптах вместо текста предпочитаеш одни id'шники выводить?

Mal Hack
Т.е. я должен всё забить в массив а потом этот массив вывести, так?


--------------------
Помнишь как бодрили дискотеки прошлого века? Теперь стул, компьютер и нету человека.

Nokia LifeStyle - Всё для смартфонов Nokia 
PM MAIL WWW ICQ   Вверх
smartov
Дата 7.2.2006, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 2
Всего: 259



Цитата(Куксикус @ 7.2.2006, 00:39 Найти цитируемый пост)
А ты не думал что поле в котором хранятся id может называться id

Ну тогда советую тебе подумать зачем в записях хранить еще и имя раздела если там уже хранится id раздела к которому эта запись принадлежит. Толку от такого дублирования информации?

Цитата(Mal Hack @ 6.2.2006, 15:05 Найти цитируемый пост)
спорить не буду, у меня тесты показывали другое.
Да и один запрос к БД всегда лучше, чем много маленьких (в большинстве, опять же)

Расскажу заодно как у меня было.
Надо было мне значит вывести дерево. Вот почти как у гр. Куксикус только 4-й вложенности. Пункстов 4-го уровня было около 4000 и увеличивалось с каждым днём. Когда я делал так
1) выбирал все пункты 4 уровня в массив в начале скрипта
2) выводил в цкиле, опираясь на if, только те, которые сейчас надо (не запутал надеюсь %))
Т.е. дерево было:
Код

     1
          2
               3
                    4
                    4
               3
                    4
.....

Так вот как я при варианте, как я написал, скрипт выполнялся около 10(!) секунд.
Когда же я сменил все циклы с if-ами на mysql_query(".... where parent_id=...") скрипт стал выполняться 2.5 секунды. Вот такие показатели.

Это сообщение отредактировал(а) smartov - 7.2.2006, 12:26
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.1151 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.