Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL-如何选择不超过x行且具有相同字段值y的最大值?_Mysql_Select_Subquery_Limit - Fatal编程技术网

MYSQL-如何选择不超过x行且具有相同字段值y的最大值?

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 |

这个问题有点棘手,所以可能以前有人问过

我正在从相关数据表中选择行。我只希望在我的集合中最多显示n行,这些行的值与表中某个字段/列的值x相同。有一个全局限制,本质上我总是希望查询返回相同数量的行,不超过n行共享值x。我该怎么做

下面是一个数据点的示例,这些数据点表示该表很大,比如20000行数据:

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”。还有其他想法吗?再次更新我的帖子。