簡體   English   中英

MYSQL-我如何選擇最多x個具有相同字段值y的行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM