MySQL: Использование JOIN для получения родительской строки только с самой последней дочерней строкой - PullRequest
0 голосов
/ 07 января 2020

У меня есть 3 таблицы:

  • Новости (news псевдоним tn)
  • Категория новостей (news_cat псевдоним tc)
  • Картинки новостей (news_pic псевдоним tp)

Мне нужно получить самые последние новости, каждая со своей категорией и только первое изображение для этой конкретной записи c, используя o как поле заказа.

Это мой текущий sql запрос:

SELECT
tn.date_news AS date_news,
tn.title AS title,
tn.text AS text,
tn.url AS url,
tc.name AS cat,
tp.file AS file
FROM news AS tn
JOIN news_cat AS tc ON tc.id_cat = tn.id_cat
JOIN (
    SELECT file FROM news_pic WHERE news_pic.id_news = tn.id_news ORDER BY temp.o LIMIT 1
) AS tp ON tp.id_news = tn.id_news
WHERE
tn.flg_featured = 1
ORDER BY tc.date_news DESC LIMIT 6

Я получаю это сообщение об ошибке:

Column not found: 1054 Unknown column 'tn.id_news' in 'where clause'

Это sqlfiddle со структурой таблиц и некоторыми примерами данных. Спасибо за любые предложения.

1 Ответ

2 голосов
/ 07 января 2020

Это проблема greatest-n-per-group; вам нужно найти минимальное значение o для каждого значения id_news, а затем JOIN news_pic для себя на значении o, соответствующем этому минимальному значению, чтобы получить первое изображение. Обратите внимание, что у вас есть несколько других ошибок (tc.flg_featured должно быть tn.flg_featured и tc.date_news должно быть tn.date_news). Это должно дать вам необходимые результаты:

SELECT
  tn.date_news AS date_news,
  tn.title AS title,
  tn.text AS text,
  tn.url AS url,
  tc.name AS cat,
  tp.file AS file
FROM news AS tn
JOIN news_cat AS tc ON tc.id_cat = tn.id_cat
JOIN news_pic tp ON tp.id_news = tn.id_news
JOIN (
  SELECT id_news, MIN(o) AS o
  FROM news_pic
  GROUP BY id_news
) AS tpm ON tpm.id_news = tn.id_news AND tpm.o = tp.o
WHERE tn.flg_featured = 1
ORDER BY tn.date_news DESC
LIMIT 6

Демонстрация по SQLFiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...