Определение LIMIT по уникальному количеству значений - PullRequest
0 голосов
/ 08 декабря 2018

Имея следующий 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 голосов
/ 08 декабря 2018

В 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;
0 голосов
/ 08 декабря 2018

Если вы хотите наименьшие значения идентификатора услуги, тогда простой метод:

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
                   );
0 голосов
/ 08 декабря 2018

Если я правильно понимаю, вы можете попытаться использовать Distinct с LIMIT в подзапросе.

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              |

Показать на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...