Задать вопрос
@aopil

Как выполнить SELECT с таким условием?

Есть таблица orders в ней есть список заказов и SERVICE_ID.
Есть таблица services в ней есть список услуг и SERVICE_LIMIT.

Для простоты понимания пример:
В таблице services есть записи
SERVICE_ID | SERVICE_NAME | SERVICE_LIMIT
5 | Sample Service      | 10
8 | Other tool          | 5


В таблице orders есть записи:
ID | SERVICE_ID | STATUS
1  |  5     | 0
2  |  5     | 0
3  |  5     | 0
4  |  8     | 0
5  |  8     | 0
6  |  8     | 0
7  |  8     | 0


Из таблицы orders мне нужно получить заказы, но только в том количестве, которое указано в таблицы services в колонке SERVICE_LIMIT.

т.е. для Sample Service не более 10 шт, а для Other tool не более 5 шт.
  • Вопрос задан
  • 308 просмотров
Подписаться 1 Простой 6 комментариев
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
aopil,
а для более старых версий невозможно выполнить то, что я хочу?


SELECT *
FROM services
JOIN (
    SELECT *,
           @row_number := CASE WHEN service_id = @service_id
                               THEN @row_number + 1
                               ELSE 1
                               END rownumber,
           @service_id := service_id
    FROM orders
    CROSS JOIN (SELECT @service_id := 0, @row_number := 0) init_vars
    ORDER BY service_id, id DESC
    ) enumerated_orders USING (service_id)
WHERE enumerated_orders.rownumber <= services.service_limit

https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=1f2a95...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Для MySQL 8.0 и выше
SELECT `o`.*
  FROM `services` AS `s`
  JOIN (
    SELECT `id`, `service_id`, `status`,
           ROW_NUMBER() OVER `win` AS `row_number`
      FROM `orders`
      WINDOW `win` AS (PARTITION BY `service_id`)
  ) AS `o` ON `o`.`service_id` = `s`.`service_id`
    AND `o`.`row_number` <= `s`.`service_limit`
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы