关于php:MySQL一起使用ORDER BY和GROUP BY

MySQL Using ORDER BY and GROUP BY together

本问题已经有最佳答案,请猛点这里访问。

我有一个表具有id价格类别的产品等...我试图从每个item_category中提取1个项目,这是最近的一个(在其自己的类别中具有最高的ID)。

这是代码,它从6个类别中获取6个项目,但它们是最旧的(ID最小)

1
2
3
    SELECT * from items WHERE item_category = '2' or item_category = '4' or
item_category = '12' or item_category = '13' or item_category = '14' or
item_category = '19' GROUP BY `item_category`  ORDER BY `item_id`  LIMIT 6

按ID排序在返回的6个项目的数组上执行,而在原始表格上没有。

我该如何取代最新的项目呢?

我认为最好的查询

1
2
3
4
5
select *
from items
where item_category in ("2","4","12","13","14","19")
group by item_category
order by item_category DESC


首先要指出的是,如果您不打算在分组中包含所有非聚合列,则应该训练自己不要使用group by。 例:

1
2
3
SELECT col1,col2 FROM table GROUP BY col1 -- BAD
SELECT col1,col2 FROM table GROUP BY col1,col2 -- GOOD
SELECT col1,MAX(col2) FROM table GROUP BY col1 -- GOOD

这是因为显而易见的问题是,您在列中不是唯一且不可预测的值,这些列在组中是唯一的,这是您所有问题的根源。

说过你应该这样做:

1
2
3
SELECT item_category, MAX(item_id)
FROM items
WHERE item_category IN ('2','4','12','13','14','19') GROUP BY `item_category`

请注意,没有必要限制,因为您只能有6个组,并且order by不再执行任何操作。

如果要获取相应的项目行,可以执行以下操作:

1
2
3
4
5
6
7
8
SELECT *
FROM items
WHERE item_id IN (
     SELECT MAX(item_id)
     FROM items
     WHERE item_category IN ('2','4','12','13','14','19')
     GROUP BY item_category
);

以下可能也有效:

1
2
3
4
5
6
7
SELECT *
FROM items i JOIN (
       SELECT i2.item_category, MAX(i2.item_id) as max_item_id
       FROM items i2
       WHERE i2.item_category IN ('2','4','12','13','14','19') GROUP BY
       i2.`item_category`
) max_ids ON i.item_id=max_ids.max_item_id;