![](/img/trans.png)
[英]Select rows where specific field has value more than half of max value of the same field
[英]MYSQL - how do i select no more than x rows max with the same field value y?
這個問題的表達有些棘手,所以以前可能有人問過。
我正在從相互關聯的數據表中選擇行。 我只希望最多有n個行,這些行具有表中某個字段/列的相同值x,以顯示在我的集合中。 有一個全局限制,從本質上講,我始終希望查詢返回相同數量的行,共享值x的行不超過n行。 我該怎么做呢?
這是一個數據示例(點應表示該表很大,假設有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
但是我不希望返回不超過another_id = 1到6的行,而希望獲得不超過2個具有some_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 |
+----+----------+-------------+------------+
請注意,結果按another_id排序,但是some_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;
首先,我們在子查詢中按some_id,id進行排序,以進行正確的計算。 然后,我們通過外部查詢中的another_id進行排序,以獲得正確的排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.