1

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

这是表格:

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 语句中完成这一点,还是我需要做的更多?

4

2 回答 2

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 个顶部元素的情况,也有几种解决方案。我不会在这里深入描述它们,也不会重复这个问题,而只是给出一个带有 SQLfiddle 示例链接的简短注释列表。(1)如果你有 3 个“固定”组 'blue','green','red' - 你可以直接使用order byand limitwith union all- sample here(2)通常你可以计算每个组内的行排名,然后在 where 条件下使用它们,这里是ANSI SQL 解决方案 (3)或者它的MySQL-specific 模拟(4)您可以使用字符串函数group_concatfind_in_set如下所示,但这是特定于 MySQL 的解决方案,不符合良好的 RDBMS 使用实践,我不建议选择它。

于 2013-10-22T14:00:06.083 回答
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语法。

于 2013-10-23T08:15:19.307 回答