条件MySQL按两个(同样重要的)列排序

时间:2012-04-25 07:27:54

标签: mysql sorting conditional

我有一系列包含大量列的产品,但对我的问题最重要的是这些(带有一些随机数据):

|--------------------------------------|
| title     | category_id | date       |
| ----------|-------------|------------|
|  Product1 |           1 | 2012-04-18 |
|  Product2 |           1 | 0000-00-00 |
|  Product3 |          17 | 0000-00-00 |
|  Product4 |          17 | 2012-04-10 |
|  Product5 |          17 | 2012-04-20 |
|  Product6 |           1 | 0000-00-00 |
|  Product7 |           2 | 2012-04-20 |
|  Product8 |           2 | 0000-00-00 |
|  Product9 |          17 | 2012-04-16 |
| Product10 |          22 | 2011-11-26 |
| Product11 |          22 | 2011-12-25 |
| Product12 |          30 | 2012-04-01 |
| Product13 |           2 | 2011-12-31 |
| Product14 |          30 | 2010-05-06 |
|--------------------------------------|

具有相同category_id的产品应该一个接一个地列出(此时甚至可以通过“ORDER BY category_id”来解决),但是我必须关注date列同样:category_id和类别中的产品必须按date降序排序(category_id,最新产品位于顶部,依此类推),理想情况下,结果集应该是这样的事情(在类别“组”之间添加换行符只是为了更透明):

|--------------------------------------|
| title     | category_id | date       |
| ----------|-------------|------------|
|  Product5 |          17 | 2012-04-20 |
|  Product9 |          17 | 2012-04-16 |
|  Product4 |          17 | 2012-04-10 |
|  Product3 |          17 | 0000-00-00 |

|  Product7 |           2 | 2012-04-20 |
| Product13 |           2 | 2011-12-31 |
|  Product8 |           2 | 0000-00-00 |

|  Product1 |           1 | 2012-04-18 |
|  Product2 |           1 | 0000-00-00 |
|  Product6 |           1 | 0000-00-00 |

| Product12 |          30 | 2012-04-01 |
| Product14 |          30 | 2010-05-06 |

| Product11 |          22 | 2011-12-25 |
| Product10 |          22 | 2011-11-26 |
|--------------------------------------|

是否可以仅使用一个查询来获取此结果集以及什么是可行的解决方案?

提前致谢, 马塞尔

2 个答案:

答案 0 :(得分:1)

您需要在子查询中找到每个类别的最新日期,将此子查询加入到您的表中并按3个字段排序:

SELECT p.* FROM products p
JOIN
( SELECT category_id, MAX(date) as category_date FROM products
  GROUP BY category_id ) pg
ON p.category_id = pg.category_id
ORDER BY pg.category_date DESC, p.category_id, p.date DESC

答案 1 :(得分:0)

因此,您首先要按具有相同ID的产品组中的最大日期日期排序,然后您要对组内的日期进行排序。

使用此:

SELECT title, category_id, date
FROM table_name t
ORDER BY
    (SELECT Max(Date)
     FROM table_name
     WHERE title = t.title
     GROUP BY category_id) DESC,
    date DESC

您可以在内部SQL查询中使用title而不是product_id