MYSQL DISTINCT和ORDER BY在一起

时间:2013-07-29 19:41:39

标签: mysql

我有一张如下表格

item_id    position_number         position_date
   1             9              2013-06-29 15:12:58
   2             7              2013-07-25 15:12:58
  18             5              2013-07-08 12:07:00
  13             9              2013-07-08 12:07:00

我想通过position_number获取项目组并按position_date DESC排序,因此查询将返回以下内容:

item_id    position_number         position_date
  13             9              2013-07-08 12:07:00
   2             7              2013-07-25 15:12:58
  18             5              2013-07-08 12:07:00

我一直在实施一些使用DISTINCT和GROUP BY的解决方案,但没有得到理想的结果。

有没有人知道如何解决它?

6 个答案:

答案 0 :(得分:3)

SELECT  a.*
FROM    tableName a
        INNER JOIN
        (
            SELECT  position_number, MAX(position_date) position_date
            FROM    tableName
            GROUP   BY position_number
        ) b ON a.position_number = b.position_number AND
                a.position_date = b.position_date
ORDER   BY a.position_number DESC

答案 1 :(得分:3)

根据您的示例数据,此查询将返回指定的结果集:

SELECT t.item_id
     , t.position_number
     , t.position_date
  FROM ( SELECT MAX(n.item_id) AS max_item_id
           FROM mytable n
          GROUP BY position_number
       ) m
   JOIN mytable t
     ON t.item_id = m.max_item_id
  ORDER BY t.position_number DESC

注意这是为每个position_number选择一个item_id。这假设给定的item_id只出现一次,并且只有一个position_number。 (如果item_id可以与多个postion_number相关联,则可以调整查询。这是使用MAX()函数来选择具有最大值的item_id。(排除的行的唯一示例是ITEM_ID = 1。)

答案 2 :(得分:2)

试试这个

  

从your_table组中选择*按position_number顺序按position_date DESC

编辑:

 SELECT `item_id`, max(`position_number`) position_number , max(`position_date`) position_date FROM TABLENAME
GROUP BY POSITION_NUMBER 
ORDER BY POSITION_DATE DESC

DEMO

答案 3 :(得分:0)

这是SQLFiddle

SELECT * FROM TABLE_NAME
    GROUP BY POSITION_NUMBER 
    ORDER BY POSITION_DATE DESC

答案 4 :(得分:0)

试试这段代码:

SELECT * FROM TABLE_NAME GROUP BY POSITION_NUMBER ORDER BY POSITION_DATE DESC

答案 5 :(得分:0)

使用GROUP_BY和MIN或MAX来决定要用于排序的组中的哪个日期。

SELECT * FROM my_table GROUP BY position_number ORDER BY MAX(position_date) DESC;