SQL: Как выбрать запись с самой последней прошедшей датой для каждой записи в другой таблице

0

Как я могу переформулировать эти два запроса в одном запросе в MySQL?

SELECT * FROM tvnetwork  
//this query gives me a list of TV networks

Но сети обычно меняют имена и логотипы, поэтому для каждой из полученных телевизионных сетей:

SELECT name, logo FROM tvnetworkinfo 
  WHERE id = $tvnetwork.id 
  AND date_since < NOW()
    ORDER BY date_since desc LIMIT 1

//this one gives me the most recent logo and name for the network

Я намеренно оставляю без изменений имя/логотип. Например. Я хочу "NatGeo" вместо старого "National Geographic", но я также хочу "SciFi" вместо еще не реализованного "SyFy".

Я хотел бы получить все в одном запросе. ¿Есть ли способ сделать это?

  • 0
    Вы уверены, что действительно хотите любую другую запись? Это означает, что в каждой сети ровно две записи. Возможно, вам нужна самая старая или самая новая запись для каждой сети?
  • 0
    Мне нужна новейшая (но не будущая) запись из tvnetworkinfo вместе с соответствующей записью tvnetwork.
Теги:
greatest-n-per-group

1 ответ

4

Чтобы получить самый последний список сетевых имен и логотипов, используйте:

SELECT x.name,
       x.logo
  FROM (SELECT tni.name,
               tni.logo
               CASE 
                 WHEN @name = tni.name THEN @rownum := @rownum + 1 
                 ELSE @rownum := 1
               END AS rank
               @name := tni.name
          FROM TVNETWORKINFO tni
       -- JOIN TVNETWORK tn ON tn.id = tni.id
          JOIN (SELECT @rownum := 0, @name := '') r
         WHERE tni.date_since < NOW()
      ORDER BY tni.name, tni.date_since DESC) x
 WHERE x.rank = 1

Я проигнорировал JOIN в таблице TVNETWORK, это не показалось необходимым для вывода. Раскомментируйте это, удалив двойной дефис перед ним в запросе, который я предоставил.

  • 0
    +1, после того, как после тестирования было совершенно ясно, что мой любимый подход LEFT JOIN & IS NULL немного медленнее :(

Ещё вопросы

Сообщество Overcoder
Наверх
Меню