Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Вывод данных из БД в несколько колонок (каталог)
Покинул форум
Сообщений всего: 9
Дата рег-ции: Дек. 2011
Помог: 0 раз(а)
Всем привет, сегодня написал скрипт вывода данных из БД в несколько колонок. Все отлично работает, но скрипт очень сложен в плане выборки из БД внутри цикла, т.е. очень много обращений к базе. Хотелось бы лишить скрипт такого недостатка.
Пробовал использовать в цикле подсчета общего количества записей 2-го уровня запись вида SELECT COUNT(*) FROM catalog WHERE parent=.$myarray1['id']. - не работает, считает непонятно чего, но точно не количество записей.
Таблица в БД имеет следующий вид: /id/name/parent все записи каталога хранятся в ней где в поле parent указан id родительского элемента.
Есть предположение что вместо запросов внутри цикла нужно использовать конструкцию inner join. Но я перешарил весь интернет и так и не нашел руководства как этой конструкцией пользоваться. Я новичек в этих делах, так что сильно не ругайте. Надеюсь на Ваш профессионализм и помощь.
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
Цитата:
нужно использовать конструкцию inner join.
это просто join. по сути то же что в where таблицы перевязать
Цитата:
Я новичек в этих делах, так что сильно не ругайте
нет ничего дебильнее подобной фразы на форумах
если по существу - классическая проблемма выборки иерапррхических данных
по уму - надо добавлять дополнительные поля с уровнями вложености или иписком парентов с строке
В твоем случае лучше всего выгрести простым селектом всю таблицу в массив а потом бегать по нему тем же циклом
Не очень гармоничное решение но все же лучше чем ходить циклом к БД.
Покинул форум
Сообщений всего: 9
Дата рег-ции: Дек. 2011
Помог: 0 раз(а)
По поводу извлечь все данные в массив, я тоже уже думал, ну это ладно когда записей 500, а когда их 50000? Сможет ли выборка перебором массива обеспечить нужное быстродейтвие? Тем более, что с разными условиями его несколько раз прогонять нужно будет?
Цитата:
по уму - надо добавлять дополнительные поля с уровнями вложености или иписком парентов с строке
Можешь подробнее об этом. Мысль такая была, но потом я подумал, а как эту вложенность высчитывать потом, когда он будет может 8-12 пунктов, не будешь же всю таблицу штудировать. Блин, а так мысль хорошая извлечь все поля с уровнем вложенности 2 например. А потом полученный массив уже циклами мучить? Правильно я понял?
Покинул форум
Сообщений всего: 9
Дата рег-ции: Дек. 2011
Помог: 0 раз(а)
И кстати, кто нибудь может объяснить как пользоваться конструкцией JOIN. Или ссылочку, где написано как пользоваться. Только не для объединения разных таблиц, а для выборки из одной.
EuGen
Отправлено: 10 Декабря, 2011 - 10:28:33
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
unambigos
Отправлено: 10 Декабря, 2011 - 11:38:34
Новичок
Покинул форум
Сообщений всего: 9
Дата рег-ции: Дек. 2011
Помог: 0 раз(а)
EuGen, нет, это помоему не то, вот инфа с Хабра, кторая меня и заставила засомневаться
Цитата:
взяв на вооружение простое правило — «никогда не выполнять запросы в цикле». Примеры того, как это можно сделать:
1. Выборки
$news_ids = get_list('SELECT news_id FROM today_news ');
while($news_id = get_next($news_ids))
$news[] = get_row('SELECT title, body FROM news WHERE news_id = '. $news_id);
Правило очень простое — чем меньше запросов, тем лучше (хотя из этого, как и из любого правила, есть исключения). Не забывайте про конструкцию IN(). Приведенный код можно написать одним запросом:
SELECT title, body FROM today_news INNER JOIN news USING(news_id)
Только вот беда, пример приведен, а я понять ничего не могу и нигде нормальной информации нет, которая могла бы мне помочь понять это.
EuGen
Отправлено: 10 Декабря, 2011 - 14:25:43
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
unambigos пишет:
Только не для объединения разных таблиц, а для выборки из одной.
По-другому это сложно понять.
Сформулируйте точно, что Вам нужно. Почитайте отдельно про join и union - поймете разницу.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
unambigos
Отправлено: 11 Декабря, 2011 - 11:45:38
Новичок
Покинул форум
Сообщений всего: 9
Дата рег-ции: Дек. 2011
Помог: 0 раз(а)
EuGen, прочитал, немного вкурил, но не пойму как объединения таблиц могут мне помочь, таблица у меня одна. Мне необходимо избавиться от запросов к базе в цикле. Это при величине каталога в 300 позиций всего например 30 позиций 1-го уровня и по 10 позиций 2-го на каждый из 30, будет 40 запросов к базе при загрузке каталога. А если позиций намного больше? Вот и надо придумать как обойтись несколькими нестандартными запросами вне цикла. Вчера пробовал добавить поле уровня вложенности. Двумя запросами создал 2 массива с пунктами 1 уровня и с пунктами 2 уровня. И с помощью 2х циклов и условия вывести их. Но ничего не получилось. Позже выложу код, может я что нибудь не так делаю?
tuareg
Отправлено: 11 Декабря, 2011 - 12:08:52
Участник
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
Я так понял Вам надо вывести дерево каталогов. На форуме поищите есть темы.
А так выдергивайте всю таблицу в массив и сортируйте его как Вам надо
unambigos
Отправлено: 11 Декабря, 2011 - 17:54:46
Новичок
Покинул форум
Сообщений всего: 9
Дата рег-ции: Дек. 2011
Помог: 0 раз(а)
Вот код, который призван работать с массивами для вывода каталога. НО он не работает, скажите где ошибка?
Должен выводить, и выводит код который представлен в шапке темы:
ПУНКТ 1ПУНКТ 2
пункт1.1 пункт2.1
пункт1.2 пункт2.2
пункт1.3 пункт2.3
А вот код, который ниже выводит только:
ПУНКТ 1ПУНКТ 3
пункт1.1
пункт1.2 ПУНКТ 4
пункт1.3
ПУНКТ 2
Не пойму в чем проблема, чисто логически все должно работать((
Покинул форум
Сообщений всего: 9
Дата рег-ции: Дек. 2011
Помог: 0 раз(а)
Почему никто не хочет мне помочь Почему код предыдущего поста выводит такую охинею?
Panoptik
Отправлено: 13 Декабря, 2011 - 11:11:56
Постоянный участник
Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011 Откуда: Одесса, Украина
Помог: 131 раз(а)
напишите лучше структуру вашей базы и что вы хотите получить, так будет больше шансов получить вразумительный ответ, чем перебирать некорректно написанный код
----- Just do it
unambigos
Отправлено: 13 Декабря, 2011 - 14:19:03
Новичок
Покинул форум
Сообщений всего: 9
Дата рег-ции: Дек. 2011
Помог: 0 раз(а)
Panoptik
Есть таблица category в базе под названием example
Она имеет следующий вид
id/name/parent
1/Телефоны/0
2/Ноутбуки/0
3/Компьютеры/0
4/LG/1
5/Nokia/1
6/HP/2
и т.д
где поле parent имеет значение id родителя, находящеголся в этой же таблице
Требуется вывести данные из базы данных (каталог, дерево каталогов кому как нравится) в произвольное число колонок, ну например в 3 колонки. Чтобы сначала шли заголовки <h3>Родитель с parent=0</h3> <ul><li>Список детей</li></ul>. Результат приблизительно отображено на сайте slando.ru.
Panoptik
Отправлено: 13 Декабря, 2011 - 15:12:13
Постоянный участник
Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011 Откуда: Одесса, Украина
Помог: 131 раз(а)
я часто применяю подобные функции при построении меню, хотя предпочитаю пользоваться дивами, а не списками, но логика всё равно остается та же:
//здесь можно всунуть проверку на то есть ли в данной категории дочерние элементы. но в данном случае я обойдусь грубо без проверки, просто выведу пустые теги если никого нет
Покинул форум
Сообщений всего: 9
Дата рег-ции: Дек. 2011
Помог: 0 раз(а)
Panoptik Спасибо большое, все работает, я в восторге!!! Только не пойму, зачем нужна переменная $level?
Все понял, она нужна для понижения уровня заголовков. Осталось только подумать как ее остановить на 1м уровне вложенности, чтобы она не выводила сразу весь каталог
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.