2010-09-20 1 views
0

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

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. –

ответ

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 

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

+0

+1, после того, как он был совершенно ясен некоторое время назад после тестирования того, что мой любимый подход «LEFT JOIN' &' NULL »довольно медленный :( – Wrikken