SQL根据重复记录选择最新记录

时间:2012-03-06 15:04:09

标签: sql database

我有2个表,wp_events和wp_merchants。

我在wp_events表中有很多重复的行,唯一的区别是记录添加到数据库时的列uploaddate(TIMESTAMP)。我需要一个从wp_events表中选择价格的SQL语句,但如果有重复项,请选择最新的。

这是我目前所拥有的,但并非所有记录都被选中。

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

2 个答案:

答案 0 :(得分: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

请检查一下,看看这是不是你的意思。

答案 1 :(得分:1)

您没有指定您正在使用的RDBMS,您可以使用ROW_NUMBER(),因此您不必将表连接到自身或使​​用子查询。这应该适用于SQL Server,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,那么你将不得不使用另一种方法。