MySQL:从每个组中选择最佳,但不重复

时间:2013-12-11 12:09:40

标签: mysql group-by unique distinct

我必须在每个类别中选择最佳记录,例如

ID| Category_Id | Item_Id | Price
1 | 1           | 1       | 10
2 | 1           | 1       | 7
3 | 1           | 2       | 8
4 | 1           | 2       | 5
5 | 2           | 1       | 9
6 | 2           | 1       | 6
7 | 2           | 2       | 3
8 | 2           | 2       | 8
9 | 3           | 1       | 5

SELECT * FROM (
  SELECT * FROM `products` ORDER BY price DESC
) AS r GROUP BY category_id

结果我得到了:

ID | CATEGORY_ID | ITEM_ID | PRICE
1  | 1           | 1       | 10
5  | 2           | 1       | 9
9  | 3           | 1       | 5

我必须修改查询才能返回唯一的ITEM_ID。例如,如果为类别1选择了项目1,则无法为类别2选择项目。因此,应为其选择下一个匹配项目。所以我应该得到:

ID | CATEGORY_ID | ITEM_ID | PRICE
1  | 1           | 1       | 10
8  | 2           | 2       | 8
9  | 3           | 1       | 5 

类别#3仅包含一个项目#1,之前用于类别#1。但复杂性是我们不能跳过任何类别。因此,如果没有剩下的ID,它必须开始使用已经使用过的项目ID。

谁可以提供帮助?

UPD:好的,我觉得它太复杂了。可能是我可以简化我的问题,如何选择非重复项ID,并且不打扰跳过的类别?例如:

ID | CATEGORY_ID | ITEM_ID | PRICE
1  | 1           | 1       | 10
8  | 2           | 2       | 8
9  | 3           | 1       | 5 

1 个答案:

答案 0 :(得分:0)

我不认为(My)SQL可以找到你想要的东西。一个简单的解决方案是在多个查询中执行此操作。假设您想在页面上显示5张图片...

伪代码:

SELECT * FROM yourTable WHERE Price = (SELECT MAX(Price) FROM yourTable);
save category_id and item_id in an array;
save everything else what you need for display anywhere;
loop over the array
   SELECT * FROM yourTable WHERE Price = (SELECT MAX(Price) FROM yourTable WHERE category_id NOT IN (/*insert used category_ids here*/) AND item_id NOT IN (/*insert used item_ids here*/));
   save category_id and item_id in an array;
   save everything else what you need for display anywhere;
end loop
present whatever you need on your page