Как выбрать две последние записи, упорядоченные по дате DESC и группировки по полю в MySQL? - PullRequest
0 голосов
/ 11 июля 2019

У меня проблема, которая сводит меня с ума, и я надеюсь, что кто-то из вас сможет мне помочь.

У меня есть таблица, где я храню несколько видео с YouTube. Теперь для каждого канала я храню через youtube API 20 видео. Так что, если у меня есть 6 каналов, у меня будет 120 видео. Каждое видео имеет своего рода «отметку времени». Мне нужно извлечь из этой таблицы два последних видео, упорядоченных по полю DESC для каждого канала. Я попробовал как загруженный скриншот, но это не то, что я хочу.

Кто-нибудь может мне помочь, пожалуйста? Sql: версия 5.5.60-MariaDB-Mysql Спасибо за любую помощь

введите описание изображения здесь

Это то, что я долго пытался

          SELECT publishedAt, channelId, channeltitle
          FROM video_from_youtube a
          WHERE a.id
            IN (
              SELECT MAX(t.id)
              FROM video_from_youtube t
              WHERE a.channelId = t.channelId
             )
            OR
                a.id
            IN (
              SELECT MAX(t.id)
              FROM video_from_youtube t
              WHERE a.channelId = t.channelId AND 
              t.id NOT IN (
                  SELECT MAX(t2.id)
                  FROM video_from_youtube t2
                  WHERE t.channelId = t2.channelId
                )
             )       
          ORDER BY a.publishedAt DESC, a.id[enter image description here][1]

это фактический результат запроса

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Вы можете сделать это проще:

SELECT vfy.publishedAt, vfy.channelId, vfy.channeltitle
FROM video_from_youtube vfy
WHERE vfy.id >= (SELECT vfy2.id
                 FROM video_from_youtube vfy
                 WHERE vfy2.channelId = vfy.channelId
                 ORDER BY vfy2.id DESC
                 LIMIT 1, 1  -- get the second
                )
ORDER BY publishedAt DESC;
0 голосов
/ 12 июля 2019

Попробуйте следующий запрос.Подзапрос v предназначен для упорядочения данных по каналу и отметке времени.Подзапрос o заключается в назначении номера каждому видео в каждом канале.Переменные сессии необходимы здесь.Когда канал изменяется (@channel_id - канал предыдущего ряда), номер начинается с 1.

SELECT o.publishedAt, o.channelId, o.channeltitle
FROM (
  SELECT v.*,
        (@video_order := CASE WHEN @channel_id = v.channelId THEN @video_order + 1 ELSE 1 END ) as row_num,
        (@channel_id := v.channelId) AS channel_id
  FROM (
    SELECT t.publishedAt, t.channelId, t.channeltitle
    FROM video_from_youtube t
    ORDER BY t.channelId, t.publishedAt DESC) v 
  ) o
WHERE o.row_num<=2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...