У меня есть две таблицы с такой структурой:
статьи: article_id, текстовые теги: tag_id, article_id, текст
Как я могу выбрать все статьи и все связанные теги с одним запросом? Как я знаю, MySQL может возвращать только двумерный массив, поэтому я могу решить одно из следующих способов: объединить все теги в столбец результата выбора статей. Но как?
Взгляните на функцию Group_Concat MySQL. Вы можете написать что-то вроде
Select A.article_id, A.text GROUP_CONCAT(B.Text) As Tags From articles A Left Outer Join tags B Using (article_id) Group By A.article_id, A.Text
Как упоминает Unreason в своем ответе, это следует использовать только в том случае, если вы хотите отображать данные, и я предложил его, потому что вы упомянули о конкатенации тегов в вопросах. Если вам нужно работать с датой, используйте простое соединение, как предложил fabrik.
Реляционные данные организованы в кортежах. Кортежи имеют n измерений и могут легко описывать функциональные отображения из m-мерных векторов в скалярные или k-мерные значения с одним отношением (таблицей). (n = m + k)
Если то, что вам нужно / предлагать, предназначено только для уровня презентации, вы можете делать то, что предлагает Эрик Хог, но если это где-то в середине процесса или в начале другого процесса, то предложение Фабрика – это правильный способ.
GROUP_CONCAT делает данные не реляционными и, следовательно, гораздо сложнее использовать в качестве основы для последующей обработки SQL. Таким образом, цель этой команды – сделать выходную информацию, если ваш клиентский уровень не сможет сделать это за вас. Не пытайтесь моделировать свои основные отношения в соответствии с проблемами презентации.
SELECT * FROM articles LEFT JOIN tags ON article.article_id = tags.article_id
Если вы сортируете по статье, то вы создаете представление данных, пропуская атрибуты статьи, связанные с повторяющимся идентификатором статьи, или просто перезапишите их:
// select a.article_id, a.text, b.tag_id, b.text as tag_text // from articles a, tags b // where a.article_id=b.article_id $articles=array(); while ($r=mysql_fetch_assoc($result)) { $article[$r['article_id']=array( 'text'=>$r['text']; ); @if (!is_array($article[$r['article_id']]['tags'])) { $article[$r['article_id']]['tags']=array(); } $article[$r['article_id']]['tags'][$r['tag_id']]=$r['tag_text']; }