Вывести данные из 4-х таблиц
есть 4 таблицы:
+news--------------+news_tags--------+users--------------+tags----------+
|id |news_id |id |id |
|name |tag_id |user_name |name |
|user_id | |user_link | |
|add_date | | | |
нужно на странице тега получить все новости с этим тегом (например id 1) + к каждой новости все теги и данные юзера.
пытаюсь сделать это так:
SELECT f.id, f.name, f.add_date,
GROUP_CONCAT(DISTINCT g.tag_id) as tid,
GROUP_CONCAT(t.name) as tags,
GROUP_CONCAT(DISTINCT u.user_name) as user_name,
GROUP_CONCAT(DISTINCT u.user_link) as user_link
FROM news_tags
as g
LEFT JOIN news AS f ON (g.news_id = f.id)
LEFT JOIN users AS u ON (u.id = f.user_id)
LEFT JOIN tags AS t ON (t.id = g.tag_id)
WHERE g.tag_id = 1
GROUP BY f.id
ORDER BY f.add_date DESC
вроде все работает, но получаю к каждой новости только один тег. подскажите как правильно составить запрос и "правильно" ли так получать эти данные? спасибо!
Ответы (1 шт):
Если хотите получить одним запросом, то нужно добавить еще 2 JOIN-а (для выборке по новости снова список тегов связанных и сами теги по связи).
Убрал лишние GROUP_CONCAT (они там не нужны, ведь автор у новости один).
tid возвращать нет смысла, когда отправляете запрос, Вы и так по нему ищите, значит в коде он есть.
И замените LEFT JOIN на INNER JOIN (если конечно у вас не может быть ситуации, что нет автора у новости).
SELECT
f.id,
f.`name`,
f.add_date,
GROUP_CONCAT( DISTINCT n2.name ) AS all_tags_for_news,
t.`name` AS tag,
u.user_name,
u.user_link
FROM
news_tags AS g
INNER JOIN news AS f ON ( g.news_id = f.id )
INNER JOIN news_tags AS g2 ON ( g2.news_id = f.id )
INNER JOIN tags AS n2 ON ( g2.tag_id = n2.id )
INNER JOIN `user` AS u ON ( u.id = f.user_id )
INNER JOIN tags AS t ON ( t.id = g.tag_id )
WHERE
g.tag_id = 1
GROUP BY
f.id
ORDER BY
f.add_date DESC