2012-03-06 112 views
3

我有2個表,wp_events和wp_merchants。SQL根據重複記錄選擇最新記錄

我在wp_events表中有很多重複的行,唯一的區別是當記錄被添加到數據庫時的列uploaddate(TIMESTAMP)。我需要一個SQL語句來從wp_events表中選擇價格,但是如果有重複,請選擇最近的。

這是我到目前爲止,但並非所有的記錄被選中。

SELECT e1.merchant, e1.price, e1.url, wp_merchants.merchant_logo, wp_merchants.merchant_name, e1.eventname 
FROM wp_merchants, wp_events e1 
LEFT JOIN wp_events e2 ON (e1.merchant = e2.merchant 
AND e1.uploaddate < e2.uploaddate) 
WHERE e2.merchant IS NULL 
AND wp_merchants.merchant_name = e1.merchant 
ORDER BY price ASC 

請參閱http://sqlfiddle.com/#!2/1db0e/1

+0

你的查詢(如果不是最優的),看起來像它返回你所描述的應該。你到底在期待什麼? – SWeko 2012-03-06 15:11:35

+0

是不是這是一個http://stackoverflow.com/questions/9270420/sql-closest-rows-to-now-but-unique重複?其實這是我提供的相同的查詢,你沒有標記爲接受,雖然它解決了這個問題。 – 2012-03-06 15:24:04

+0

嗨是的,但由於某些原因,輸入更多的行後,似乎有問題。感謝您的期待..請參閱:ticketreview.net/festival-tickets/european-festivals/... 這列出了來自同一商家(WTS)的3個結果,但是您的查詢和上面的查詢僅從可能的4中選擇3個。因此,在結果中沒有WTS .. - – 2012-03-06 15:40:08

回答

1

我覺得這是你追求的:

SELECT e.merchant, e.price, e.url, m.merchant_logo, m.merchant_name, e.eventname 
FROM wp_events e 
INNER JOIN wp_merchants m 
ON e.merchant = m.merchant_name 
AND e.uploaddate = (SELECT MAX(uploaddate) FROM wp_events WHERE merchant = e.merchant AND eventname = e.eventname) 
ORDER BY price ASC 

請檢查看看,如果這是你的意思。

+0

感謝您的關注..請參閱: http://www.ticketreview。 net/festival-tickets/european-festivals/rock-im-park-festival-2012-wee-tickets-tickets-at-zeppelinfeld-01-june-2012-buy-your-2012-festival-tickets-now/ 它列出來自同一商家的3個結果,但此查詢僅選擇3個可能的4.因此,結果中沒有WTS .. – 2012-03-06 15:30:07

+0

我更新了http://sqlfiddle.com/#!2/d1 871/2顯示我的意思,正確的結果不會返回。請你花2分鐘看看。 – 2012-03-06 16:17:36

+0

我只是缺少一小部分。我已經更新了我的答案。 – aaroncatlin 2012-03-06 16:24:31

1

您沒有指定您正在使用的RDBMS,有可能您可以使用ROW_NUMBER(),因此您不必將表連接到自身或使​​用子查詢。這應該在SQL服務器,Oracle,或PostgreSQL工作:

SELECT * FROM (
    SELECT e.merchant AS merchant_name, e.price, e.url, e.event_name, m.merchant_logo 
     , ROW_NUMBER() OVER (PARTITION BY e.merchant ORDER BY e.uploaddate DESC) as the_row 
     FROM wp_events e 
    INNER JOIN wp_merchants m 
     ON e.merchant = m.merchant_name 
    ) WHERE the_row = 1 
ORDER BY price ASC 

如果你使用MySQL,那麼你就必須使用另一種方法。

+0

謝謝你讓我知道,它實際上是我使用的MySQL。 – 2012-03-06 15:35:11