Допустим существует таблица `publications`(публикации) и таблица `categories` (категории сайта). Каждая публикация может быть размещена в нескольких категориях, для этого создана таблица `pub_cat` с записями вида: Код (Text): id | pub | cat 1 | 1 | 1 2 | 1 | 2 3 | 2 | 2 4 | 2 | 3 что означает: первая публикация отностися к категориям с id 1 и 2, вторая соответственно к 2 и 3. В админке сайта требуется вывести список публикаций, рядом с каждой из которых должен быть список категорий в которых она размещена. После запроса: Код (Text): SELECT `publications`.`id, ............ FROM `publications` INNER JOIN `pub_cat` ON `publications`.`id` = `pub_cat`.`pub` ....... Ответ содержит исчерпывающую информацию, но мне известен только последовательный перебор Код (Text): while ($row = mysql_fetch_array($result)) в котором выводятся "дублирующие записи", и код типа Код (Text): $show = ($row['id'] == $lastid)?false:true; мне не помог ибо кто такой $lastid в первом извлеченном ряде - не известно. Уверен, многие сталкивались. Как выполнить правильный вывод инфы? Не предлагать структуры следующего вида: Код (Text): $query = "SELECT * FROM `publications`;" ... ... ... while ($row = mysql_fetch_array($result)) { $query = "SELECT * FROM `pub_cat` WHERE `cat` = '${row['id']}';" ... ... ... while ($row_cat = mysql_fetch_array($result2)) { .... } } ИМХО при выводе пятисот публикаций php скрипт создает еще стопятсот запросов, что жутко грузит скулу.
Код (Text): SELECT `publications`.`id`, `publications`.`date`, `publications`.`heading`, `publication`.`publication`, `publication`.`category`, `categories`.`heading` AS `catname` FROM `publications` INNER JOIN `publication` ON `publications`.`id` = `publication`.`publication` INNER JOIN `categories` ON `publication`.`category` = `categories`.`id` GROUP BY `publications`.`id` После группировки теряются данные по категориям в которых размещена публикация ( Пытался сделать CONCAT_WS('+', `categories`.`heading`) AS `catcat` чтобы сложить все категории в одну строчку через разделитель "+", но оказывается CONCAT_WS работает только с разными полями, а не по одному полю с GROUP BY (
Для этого есть GROUP_CONCAT. http://dev.mysql.com/doc/refman/5.0/en/ ... oup-concat Минусы - поля создаваемое таким способом ограниченно в длине (хотя для пары-тройки-десятка категорий хватит за глаза, и это настраивается, если у вас есть права на это) и этот способ относительно медленный. Но в принципе, если вы хотите обойтись в вашей задаче одним запросом, у вас эти 2 способа - да. Либо вы "сложите" списки категорий в одну строчку на ДБ сервере через GROUP_CONCAT и потом снова разделите её в PHP через банальный explode() итд., либо получите "квадратный" результат типа вашего первого примера и будете разбирать его уже в PHP через foreach или еще как.
Только что мне подсказали об этой функции большое спасибо! А я сначало пытался CONCAT_WS, очень похожа, но не для этого. Конечно я хочу обойтись одним запросом. Можно конечно сделать просто SELECT по публикациям, а потом в самом цикле делать еще один запрос "в каких же категориях она опубликована" , но такой метод запрещен здравым смыслом Данные разнесены в разные таблицы да бы избежать "избыточности данных" или как там правильно про реляционные базы данных.... Судя по небольшому количеству ответов на мой вопрос, программеры не очень то парятся о избыточности и о всяких теоретически правильных вещах?
не, я мимо проходил прокрутил тему вниз, на посты отвечают значит все норм )ушел ) а еше мне Luge рассказывал про http://ru.wikipedia.org/wiki/%D0%94%D0% ... 0%B8%D1%8F но с этим тоже переусердствовать как выяснилось не надо
Спасибо, прочел, теперь вот думаю. Может денормализировать нафиг ))))) ? Блин, а в институте говорили "Нормализируйте, нормализируйти и еще раз..."
опять двойка… А можно сделать два запроса и не тягать избыточные данные всем наплевать на данную конкретную тему, вот и всё.
ММм? Два запроса? И нет запросов в цикле??? В принципе GROUP_CONCAT помог, жаль нужно делать explode() в PHP, жаль ограничение на 1024 в GROUP_CONCAT, и жаль что нельзя чтобы список категорий был массивом, а не объединенной строчкой, как у людей чтоб... А что там про 2 запроса, мне очень интересно!!!
http://ru2.php.net/serialize хз хранить ето в базе не пробовал) а в ini где нибудь разве не меняется?