通过唯一数量的值定义LIMIT

时间:2018-12-08 15:43:25

标签: mysql sql

具有以下SQL查询

SELECT service_id, service_box_id FROM table1 WHERE 1 LIMIT 10

结果如下表

service_id  | service_box_id 
12          | 1
12          | 2
12          | 3
21          | 1
21          | 2
33          | 1
33          | 2
33          | 3
33          | 4
33          | 5

因此,查询显示10行,在这种情况下,具有3个唯一的service_id值-12、21、33。

是否可以在查询中定义“ LIMIT”以显示 10个唯一的service_id值,而无需先运行另一个sql查询?或任何其他限制查询输出的方法。

所需的输出:

service_id  | service_box_id 
12          | 1
12          | 2
12          | 3
21          | 1
21          | 2
33          | 1
33          | 2
33          | 3
33          | 4
33          | 5
34          | 1
34          | 2
38          | 1
43          | 1
43          | 2
43          | 3
44          | 1
44          | 2
45          | 1
45          | 2
46          | 1
46          | 2
48          | 1
48          | 2

因此,有10个唯一的service_id-12、21、33、34、38、43、44、45、46、48,但总共有24行。

3 个答案:

答案 0 :(得分:1)

如果我理解正确,可以尝试在where子查询中将DistinctLIMIT一起使用。

SELECT service_id, service_box_id 
FROM table1
WHERE service_id in (
    SELECT service_id 
    FROM (
        SELECT Distinct service_id
        FROM table1 
        ORDER BY service_id 
        LIMIT 10
    ) t1
)

| service_id | service_box_id |
| ---------- | -------------- |
| 12         | 1              |
| 12         | 2              |
| 12         | 3              |
| 21         | 1              |
| 21         | 2              |
| 33         | 1              |
| 33         | 2              |
| 33         | 3              |
| 33         | 4              |
| 33         | 5              |
| 34         | 1              |
| 34         | 2              |
| 38         | 1              |
| 43         | 1              |
| 43         | 2              |
| 43         | 3              |
| 44         | 1              |
| 44         | 2              |
| 45         | 1              |
| 45         | 2              |
| 46         | 1              |
| 46         | 2              |
| 48         | 1              |
| 48         | 2              |

View on DB Fiddle

答案 1 :(得分:1)

在MySQL 8+中,我们可以在此处尝试使用DENSE_RANK

SELECT service_id, service_box_id
FROM
(
    SELECT *, DENSE_RANK() OVER (ORDER BY service_id) dr
    FROM table1
) t
WHERE dr <= 10;

如果您使用的是早期版本的MySQL,则我们将加入一个子查询,该子查询将找到前10个service_id值:

SELECT t1.service_id, t1.service_box_id
FROM table1 t1
INNER JOIN
(
    SELECT DISTINCT service_id
    FROM table1
    ORDER BY service_id
    LIMIT 10
) t2
    ON t1.service_id = t2.service_id;

答案 2 :(得分:1)

如果您想要最低的服务ID值,那么一个简单的方法是:

SELECT service_id, service_box_id
FROM table1
WHERE service_id < (SELECT DISTINCT tt1.service_id
                    FROM table1 tt1
                    ORDER BY tt1.service_id
                    LIMIT 1 OFFSET 10
                   );