MYSQL-如何选择不超过x行且具有相同字段值y的最大值?
这个问题有点棘手,所以可能以前有人问过 我正在从相关数据表中选择行。我只希望在我的集合中最多显示n行,这些行的值与表中某个字段/列的值x相同。有一个全局限制,本质上我总是希望查询返回相同数量的行,不超过n行共享值x。我该怎么做 下面是一个数据点的示例,这些数据点表示该表很大,比如20000行数据:MYSQL-如何选择不超过x行且具有相同字段值y的最大值?,mysql,select,subquery,limit,Mysql,Select,Subquery,Limit,这个问题有点棘手,所以可能以前有人问过 我正在从相关数据表中选择行。我只希望在我的集合中最多显示n行,这些行的值与表中某个字段/列的值x相同。有一个全局限制,本质上我总是希望查询返回相同数量的行,不超过n行共享值x。我该怎么做 下面是一个数据点的示例,这些数据点表示该表很大,比如20000行数据: some_table +----+----------+-------------+------------+ | id | some_id | some_column | another_id |
some_table
+----+----------+-------------+------------+
| id | some_id | some_column | another_id |
+----+----------+-------------+------------+
| 1 | 10 | value | 8 |
| 2 | 10 | value | 5 |
| 3 | 10 | value | 2 |
| 4 | 20 | value | 3 |
| 5 | 30 | value | 9 |
| 6 | 30 | value | 1 |
| 7 | 30 | value | 4 |
| 8 | 30 | value | 6 |
| 9 | 30 | value | 7 |
| 10 | 40 | value | 10 |
| .. | ... | ... | ... |
| .. | ... | ... | ... |
| .. | ... | ... | ... |
| .. | ... | ... | ... |
+----+----------+-------------+------------+
下面是我的选择:
select * from some_table where some_column="value" order by another_id limit 6
但是,我不希望返回另一个_id=1到6的行,而是希望得到不超过2个具有某个_id相同值的行。换句话说,我希望得到:
result set
+----+----------+-------------+------------+
| id | some_id | some_column | another_id |
+----+----------+-------------+------------+
| 6 | 30 | value | 1 |
| 3 | 10 | value | 2 |
| 1 | 10 | value | 3 |
| 7 | 30 | value | 4 |
| 4 | 20 | value | 8 |
| 10 | 40 | value | 10 |
+----+----------+-------------+------------+
请注意,结果按另一个_id排序,但某些_id值相同的结果不超过2个
我怎样才能最好地在一个查询中表达自己的意思,并合理地快速到达目的地?谢谢
select id, some_id, some_column, another_id from (
select
t.*,
@rn := if(@prev = some_id, @rn + 1, 1) as rownumber,
@prev := some_id
from some_table t
, (select @prev := null, @rn := 0) var_init
where some_column="value"
order by some_id, id
) sq where rownumber <= 2
order by another_id;
现场观看它的工作
首先,我们通过子查询中的某个_id,id来进行正确的计算。然后我们通过外部查询中的另一个\u id进行排序,以获得正确的排序。2是固定的还是可以使用其他k而不是2?表的大小是多少?如上所述,k/n是可变的。表的大小应该无关紧要,但也不是固定的。谢谢,这适用于我的示例数据的本机排序。无论顺序如何,或数据顺序混乱或输入/添加顺序不正确,我如何使其工作?。。。要是我能以某种方式创建一个临时数组来记录不同的、不同的一些\u id实例就好了。。?或者可能有一种方法可以计算/查看已获取的数据?修复了此问题,请重试。谢谢,很抱歉,最初提供的示例数据没有正确说明我的问题。我现在已经更新了它,添加了另一列,排序/排序必须通过该列进行。”“按某个id排序”将不起作用,并且在获得结果集后重新排序也不会起作用,因为我只获取了一部分,请参见上面的“限制6”。还有其他想法吗?再次更新我的帖子。