2010-09-20 63 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”而不是旧的“国家地理”,但我也想要“SciFi”而不是尚未实施的“SyFy”。

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

+0

你确定你真的想要其他记录吗?这意味着每个网络都有两条记录。也许你想要每个网络的最旧或最新的记录? – 2010-09-20 21:34:03

+0

我需要tvnetworkinfo的最新(但不是未来)记录,以及相应的tvnetwork记录。 – 2010-09-21 03:28:05

回答

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'&'NULL NULL'方法相当慢一些 – Wrikken 2010-09-20 21:41:08

相关问题