通过值的唯一数量定义限制

yzckvree  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(360)

有以下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个唯一的服务id值-12、21、33。
是否可以在查询中定义“limit”以显示10个唯一的服务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个独特的服务标识-12,21,33,34,38,43,44,45,46,48,但总共24行。

h79rfbju

h79rfbju1#

如果您想要最低的服务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
                   );
uinbv5nw

uinbv5nw2#

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

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              |

db fiddle视图

kcugc4gi

kcugc4gi3#

在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;

相关问题