2010-09-20 50 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