SQL:如何为其他表上的每个记录选择具有最近过去日期的记录

时间:2010-09-20 21:19:57

标签: sql mysql greatest-n-per-group

如何在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

我故意遗漏了NEXT名称/徽标更改。例如。我想要“NatGeo”而不是旧的“国家地理”,但我也想要“SciFi”而不是尚未实施的“SyFy”。

我想在一个查询中检索所有内容。 ¿有没有办法做到这一点?

1 个答案:

答案 0 :(得分:4)

获取最新的网络名称列表&amp;徽标,使用:

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表的JOIN,输出似乎没有必要。通过在我提供的查询中删除之前的双连字符取消注释。