Объединение 1 строки MySQL с несколькими результатами - PullRequest
1 голос
/ 14 марта 2011

У меня проблема со списком статей и соответствующих тегов, может быть, кто-то может мне помочь.

Представьте себе запрос:

select *.articles, tags.tag_name 

from articles

left join tags on tags.article_id = articles.article_id

where articles.article_id = 1

Это бы хорошо работало, если бы в статье был только один тег. Проблема в том, что если в статьях более 1 тега, я получаю по 1 строке на тег для одной и той же статьи. Если я хочу, чтобы эти статьи были показаны для каждой из них, они показываются многим из одной статьи.

Есть ли способ сохранить это в одной строке или мне нужно использовать два запроса, один для информации о статье и один для тегов? Это было бы плохо, так как список из 50 artciles потребовал бы 50 запросов для отображения их тегов.

Ответы [ 3 ]

0 голосов
/ 14 марта 2011

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

select a.article_id, GROUP_CONCAT(t.tag_name)
from articles a
    left join tags t using (article_id)
where a.article_id = 1
group by a.article_id

Или выполните один запрос с объединением и получите дублированную информацию о статье, которую вы затем можете повторно объединить программно. Это можно автоматизировать с помощью ORM.

0 голосов
/ 14 марта 2011

Вы можете использовать функцию GROUP_CONCAT():

SELECT *.articles, GROUP_CONCAT(tags.tag_name)
FROM articles
LEFT JOIN tags ON tags.article_id = articles.article_ID
WHERE articles.article_id = 1
GROUP BY articles.article_id

Он преобразует эти дополнительные строки в одно поле.

0 голосов
/ 14 марта 2011

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

select *.articles, tags.tag_name 

from articles

inner join rel_tags on articles.article_id = rel_tags.article and articles.article_id = 1

inner join tags on rel_tags.tag = tags.tag_id
...