我会在这里解释我的问题......
这是表格:
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语句中完成此操作,还是需要做更多工作?
答案 0 :(得分:0)
让您的表名为tbl
,列名为id
,color
,n
。一种可能的解决方案是这样的:
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 by
和limit
{{1 } - sample here。 (2)一般情况下,您可以计算每个组内的行级别,然后在条件适用的地方使用它们,这里是ANSI SQL solution (3)或其{{3} }。 (4)您可以使用字符串函数union all
和group_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语法。