从特定列中为多个值选择有限的重复值

时间:2013-10-22 13:39:07

标签: mysql duplicates limit

我会在这里解释我的问题......

这是表格:

id | column 1 | column 2
---+----------+---------
1  | green    | 15
2  | green    | 84
3  | green    | 88
4  | red      | 85
5  | red      | 51
6  | red      | 45
7  | red      | 54
8  | blue     | 58
9  | blue     | 58
10 | blue     | 78

现在我只想要最近2个绿色,最近2个红色,最近2个蓝色。

输出必须如下:

id | column 1 | column 2
---+----------+---------
2  | green    | 84
3  | green    | 88
6  | red      | 45
7  | red      | 54
9  | blue     | 58
10 | blue     | 78

我如何在一个mysql语句中完成此操作,还是需要做更多工作?

2 个答案:

答案 0 :(得分:0)

让您的表名为tbl,列名为idcolorn。一种可能的解决方案是这样的:

select * from tbl where id in (
 select max(id) from tbl group by color
union all
 select max(id) from tbl t
 where id not in (select max(id) from tbl t1 where t1.color=t.color)
 group by color
)
order by color, id desc

这是测试和玩耍:http://sqlfiddle.com/#!2/453af7/1/0

对于需要每组中N个顶部元素的情况,还存在多种解决方案。我不会在这里深入描述它们,不是复制this question,而只是给出带有SQLfiddle示例链接的简短注释列表。 (1)如果您有3个“固定”组“蓝色”,“绿色”,“红色” - 您可以直接使用order bylimit {{1 } - sample here(2)一般情况下,您可以计算每个组内的行级别,然后在条件适用的地方使用它们,这里是ANSI SQL solution (3)或其{{3} }。 (4)您可以使用字符串函数union allgroup_concat,例如MySQL-specific analog,但这是特定于MySQL的解决方案,不符合良好的RDBMS使用惯例,我会不建议选择它。

答案 1 :(得分:0)

我用fthiella偷来的这个查询解决了这个难题并稍微调整了一下:

SELECT
$yourtable.*
FROM
$yourtable INNER JOIN (
SELECT
$limit_item,
GROUP_CONCAT($the_id ORDER BY add_time DESC) grouped_year
FROM
$yourtable
GROUP BY $limit_item) group_max
ON $yourtable.$limit_item = group_max.$limit_item
AND FIND_IN_SET($the_id, grouped_year) <=3

$ limit_item这里是你想要的项目n次。 $ the_id只是你表中的id,我实际上不知道为什么他们使用它。这个查询的好处是你可以手动设置你想要限制的重复项的数量。

美元是php语法。