MySQL 同时使用 ORDER BY 和 GROUP BY

Den*_*zov 4 php mysql

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

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

    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
Run Code Online (Sandbox Code Playgroud)

Order by ID 在返回的 6 个项目的数组上执行,而不在原始表上执行。

我该如何提取最新的项目?

我认为最好的查询

select *
from items
where item_category in ("2","4","12","13","14","19")
group by item_category
order by item_category DESC
Run Code Online (Sandbox Code Playgroud)

apo*_*fos 5

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

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
Run Code Online (Sandbox Code Playgroud)

这是因为一个明显的问题是,您在组中不是唯一的列中获得任意且不可预测的值,而组中是所有问题的根源。

话虽如此,你应该这样做:

SELECT item_category, MAX(item_id) 
FROM items 
WHERE item_category IN ('2','4','12','13','14','19') GROUP BY `item_category`
Run Code Online (Sandbox Code Playgroud)

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

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

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
);
Run Code Online (Sandbox Code Playgroud)

以下方法也可能有效:

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;
Run Code Online (Sandbox Code Playgroud)