| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Базы Данных > Выводит одинаковые записи вместо разных |
| Автор: R.M. 2.2.2006, 23:31 | ||
Пишу такой код
Должен выводить так: Категория 1 Запись 1 Запись 2 Категория 2 Запись 1 Запись 2 и т.п., а выводит так: Категория 1 Запись 1 Запись 1 Категория 2 Запись 1 Запись 1 В чём ошибка? |
| Автор: Mal Hack 3.2.2006, 01:06 | ||
$row_in наверное надо. А вообще, я сторонник того, чтобы не выполнять каждый раз запрос, а сначала все загрузить в единый массив, а потом его мучить. |
| Автор: Mal Hack 3.2.2006, 12:29 |
| МНе мож удобно, как в Асме с каждым регистром работать... Твой подход не рационален с точки зрения времени работы и ресурсоемкости. |
| Автор: -=Ustas=- 4.2.2006, 06:38 | ||
По-моему, здесь лучше и гораздо рациональнее будет пробежаться рекурсивно. |
| Автор: smartov 4.2.2006, 11:41 | ||
Mal Hack
Глупости. Наоборот такой подход будет работать быстрее, если база (как в 99% случаев) расположена на том же хосте, что и скрипты. |
| Автор: Bikutoru 4.2.2006, 12:32 | ||||||||
Строка 14:
хотя по логике должно быть
ИМХО
такой код будет работать побыстрее, чем твой при большом количестве записей...
Т.е. ты хочешь сказать, что если в таблице несколько тысяч разделов записей, то эти несколько тысяч запросов к базе будут работать быстрее одного запроса, который возвращает все эти записи??? Очень сильно сомневаюсь... |
| Автор: smartov 4.2.2006, 13:27 | ||||
Bikutoru
Неверное понимание. Эти несколько тысяч запросов будут работать во много раз быстрее чем несколько тысяч array_filter-ов, которые придется применять при нормальной организации базы при выводе дерева элементов. П.С. Фраза моя была ответом на фразу
А организация базы, как у товарища Куксикус, где каждой у записи в поле razdel вместо id раздела написано его имя(!!) |
| Автор: Mal Hack 4.2.2006, 15:50 | ||||
Да? Ты бы для начала хоть тестирование провел... Нет, я не спорю, что на каких-то задачах выгоднее сделать много маленьких запросов, чем отом шерстить один большой. Но таких задач меньше, точнее они редко ставятся.
А где ты там видел, чтобы я упоминал про фильтры? Запросы к базе это внешние операции, которые в большинстве случаев будут выполняться намного дольше, чем внутрескриптовые конструкции. Модератор: за хамский тон по отношению к участникам в следующий раз буду кирпич вешать. |
| Автор: R.M. 6.2.2006, 12:49 | ||
С чего ты взял что у меня нет id ? Mal Hack Чтобы сначала всё засунуть в переменную а потом это выводить за циклом нужен ещё один цикл для вывода или я неправильно тебя понял? Привиди пожалуйста пример Добавлено @ 12:52 Кстати насчёт кирпичей... а куда мой пропал? |
| Автор: Mal Hack 6.2.2006, 14:29 | ||||
Ты должен делать что-то вроде:
Там где .... Надо сделать условие, для вывода инфы от нужной категории.. Тут ИМХО if надо будет еще юзать. |
| Автор: smartov 6.2.2006, 15:27 | ||||||||
| Так исходя из
Который должен отображать "Категория 1" на id не очень похожа О, поверь. Я с этим намахался много в свое время. И тестирование проводил еще как.
Про большинство случаев - совершенно верно. Но при случае фильтрования (выбрать записи которые входят в раздел) то обращение к базе ("select * ... where razdel_id=....") будет куда быстрее чем выбирать эти записи "внутрескриптовыми конструкциями" из массива всех записей, считаных предварительно. Именно то что предложил ты.
Твой код + как ты говришь если if заюзать - вот это и будет работать медленее. И чем больше будет записей тем больше будет разница. (Повторюсь - при условии того что mysql база находится на localhost по отношению к скриптам) |
| Автор: Mal Hack 6.2.2006, 16:05 |
| smartov спорить не буду, у меня тесты показывали другое. Да и один запрос к БД всегда лучше, чем много маленьких (в большинстве, опять же) |
| Автор: R.M. 7.2.2006, 01:39 | ||
smartov
А ты не думал что поле в котором хранятся id может называться id а не раздел и переменная $row['razdel'] выводит название раздела а не id или ты во всех своих скриптах вместо текста предпочитаеш одни id'шники выводить? Mal Hack Т.е. я должен всё забить в массив а потом этот массив вывести, так? |
| Автор: smartov 7.2.2006, 12:25 | ||||
| Ну тогда советую тебе подумать зачем в записях хранить еще и имя раздела если там уже хранится id раздела к которому эта запись принадлежит. Толку от такого дублирования информации?
Расскажу заодно как у меня было. Надо было мне значит вывести дерево. Вот почти как у гр. Куксикус только 4-й вложенности. Пункстов 4-го уровня было около 4000 и увеличивалось с каждым днём. Когда я делал так 1) выбирал все пункты 4 уровня в массив в начале скрипта 2) выводил в цкиле, опираясь на if, только те, которые сейчас надо (не запутал надеюсь %)) Т.е. дерево было:
Так вот как я при варианте, как я написал, скрипт выполнялся около 10(!) секунд. Когда же я сменил все циклы с if-ами на mysql_query(".... where parent_id=...") скрипт стал выполняться 2.5 секунды. Вот такие показатели. |
| Автор: Mal Hack 7.2.2006, 13:44 | ||
Делал также smartov еще раз тебе повторяю про хамский тон, а именно: |
| Автор: R.M. 8.2.2006, 03:11 |
| smartov А мне нужен и id и русское название раздела и английское название раздела..... случаи разные бывают. |
| Автор: smartov 8.2.2006, 12:31 |
| Куксикус Дык! Mal Hack Если слова "товарищ" и "гражданин" (а моежет еще и "камрад"?!) на этом форуме считаются ругательными, прошу указать мне на пункт в правилах, гже это написано. Спасибо. |
| Автор: R.M. 8.2.2006, 16:18 |
| smartov id - для упорядочивания категорий в том порядке, который мне нужен. английское название для ЧПУ русское название сам понимаеш для чего - должны же люди знать в какой раздел они заходят |
| Автор: Mal Hack 8.2.2006, 16:18 |
| smartov я не про слова, я про ТОН !! |
| Автор: smartov 8.2.2006, 18:04 |
| Куксикус Недопонял Но смотри. По хорошему. Должна быть отдельная таблица "Разделы" С полями (например) id english_name russian_name А в таблице записей, должно быть поле razdel_id (например). А то так ты вдруг решишь поменять название раздела. И тогда тебе придется менять эту строку во ВСЕХ записях Это один из вариантов возможных проблем. А если ты вдруг захочешь еще и... ну украинский язык добавить, наример. Страшно подумать что надо будет всем записям (которых уже к тому моменту много может быть) добавить поле и прописать туда значение. А вот в таблицу разделов добавить поле или хоть 10 будет куда меньшей проблемой. Молчу про то, сколько лишнего места кушается, и про то, что призводительность падает (ведь при чтении каждой записи читаются русское и английское имена раздела). Так бы они читались только один раз из таблицы разделов. Инересно, давно это мой текст еще и тон передает (до чего техника дошла). Тем более что я его изо всех сил старался смягчить смайликами. Особенно во втором случае прецедента вообще не вижу. Здаётся мне это просто у тебя как в цитате: "Такую личную неприязнь я испитываю к потерпевшему, что просто кушать не могу" © Мимино |
| Автор: R.M. 9.2.2006, 01:50 | ||||
smartov
В каких записях? это чисто название раздела оно только выводится и больше нигде ни в каких таблицах не фигурирует, то, что в разделе содержится селектится по cat = id раздела.
Кроме русского никаких языков больше небудет - сайт для русскоязычного населения, у иностранцев....другой склад ума так сказать, а украинские пользователи интернета по русски хорошо понимают насколько я знаю Mal Hack,smartov, успакойтесь |
| Автор: smartov 9.2.2006, 11:46 | ||
| Куксикус Ну вот! Верно же Может я просто неверно понял. Но если я правильно представил себе структуру твоей таблицы записей, то она примерно такая
И получается что у каждой записи есть поле с именем раздела к которому она принадлежит. Если я не прав - поправь. Если так - то и получается дублирование инфы. |
| Автор: -=Ustas=- 9.2.2006, 12:09 |
| Куксикус, давай еще раз на БИС, выложи структуры твоих задействованных, в данной ситуации, таблиц о подробнее опиши, что ты хочешь добиться. ЗЫ. По-моему ты запутал уже всех |
| Автор: smartov 9.2.2006, 14:17 |
| -=Ustas=- Да он уже всего добился |
| Автор: R.M. 10.2.2006, 09:32 |
| Структура id | eng | rus | cat | razdel id - номер записи eng - название для ЧПУ т.е. чтото вроде http://blablabla.ru/razdel/podrazdel rus - русское название для вывода на экран cat - на сайте 3 главных категории и цифра в этом поле показывает в какую категорию выводить данную запись razdel - в одной из категрий нужны подкатегории и это поле отвечает в какой подкатегории будут выводиться записи Помоему тут всё нужно |
| Автор: -=Ustas=- 10.2.2006, 09:37 |
| Ну, судя по всему, избыточной информации нет. |
| Автор: smartov 10.2.2006, 11:49 |
| Куксикус Вопрос закрыт |