Построить динамический c SQL запрос для сортировки записей с ограничением - PullRequest
0 голосов
/ 26 апреля 2020

Пожалуйста, рассмотрите следующий сценарий, чтобы понять мое требование.

У меня есть список типов продуктов

Webinar, Summit, Intent 

История: Пользователь (учетная запись) может подписаться на любой (Webinar, Intent, Summit) виды продукции. Если пользователь подписался на все вышеупомянутые product_type, то в ответе все product_type должны отображаться в следующем порядке: , но при условии, что мы показали только 6 записей .

У меня есть таблица с именем test

Table: test
+-----+--------------+-----------+------------+----------+
| id  | product_type |  status   | account_id | event_id |
+-----+--------------+-----------+------------+----------+
|   1 | Summit       | Active    |          1 |      123 |
|   2 | Intent       | Pending   |          1 |      456 |
|   3 | Intent       | Completed |          1 |      789 |
|   4 | Webinar      | Completed |          1 |      321 |
|   5 | Summit       | Inactive  |          1 |      465 |
|   6 | Summit       | Completed |          1 |      126 |
|   7 | Intent       | Inactive  |          1 |      965 |
|   8 | Webinar      | Completed |          1 |      325 |
|   9 | Summit       | Pending   |          1 |      145 |
|  10 | Intent       | Pending   |          1 |      568 |
+-----+--------------+-----------+------------+----------+

Столбец product_type может иметь различные значения, например

<em>"Webinar", "Intent", "Summit"</em>

Столбец status может иметь различные значения, например

<em>"Pending", "Inactive", "Active", "Completed"</em>

Я хочу отсортировать записи сначала по столбцу status, а затем по столбцу product_type.

, вот порядок сортировки:

status sorting order: Pending, Inactive, Active, Completed

product_type sorting order: Webinar, Summit, Intent 

//If any product_type with status Pending it should sort first then Inactive so on.

//If 2 different product_type like Intent and Summit having the same status then query should be sort by product_type

Пожалуйста, рассмотрите следующий сценарий. Предположим, что на аккаунт подписано всего 30 product_type, например

Total 10 Webinar: 5 pending and 5 Completed
Total 12 Summit: 6 Inactive and 6 Completed
Total 8 Intent: 4 Active and 4 Completed

Как я уже упоминал, запрос должен вернуть только 6 записей. Если мы рассмотрим выше порядок сортировки, тогда запрос должен показывать результат ниже результата.

4 pending Webinar
1 Inactive Summit
1 Active Intent

Сценарий: 1

Suppose in request I get account_id = 1 and productTypes = "Webinar, Intent, Summit"

Согласно test таблица account_id = 1 подписан на все (Webinar, Intent, Summit) product_type, поэтому в ответ мы должны показать все product_type, связанные с учетной записью с заданным порядком сортировки (сначала статус, а затем product_type). поэтому запрос должен возвращаться ниже вывода.

+----+--------------+-----------+------------+----------+
| id | product_type |  status   | account_id | event_id |
+----+--------------+-----------+------------+----------+
|  9 | Summit       | Pending   |          1 |      145 |
|  2 | Intent       | Pending   |          1 |      456 |
| 10 | Intent       | Pending   |          1 |      568 |
|  5 | Summit       | Inactive  |          1 |      465 |
|  7 | Intent       | Inactive  |          1 |      965 |
|  4 | Webinar      | Completed |          1 |      321 |
+----+--------------+-----------+------------+----------+

Сценарий: 2 Suppose in request I get account_id = 1 and productTypes = "Webinar, Intent"

Кстати, account_id = 1 подписан на все (Webinar, Intent, Summit) product_type, но в запросе мы получаем только productTypes = Webinar, Intent, поэтому запрос должен быть отсортирован по (сначала статус, затем product_type) для Webinar, Intent

Ожидаемый результат:

+----+--------------+-----------+------------+----------+
| id | product_type |  status   | account_id | event_id |
+----+--------------+-----------+------------+----------+
|  2 | Intent       | Pending   |          1 |      456 |
| 10 | Intent       | Pending   |          1 |      568 |
|  7 | Intent       | Inactive  |          1 |      965 |
|  4 | Webinar      | Completed |          1 |      321 |
|  8 | Webinar      | Completed |          1 |      325 |
|  3 | Intent       | Completed |          1 |      789 |
+----+--------------+-----------+------------+----------+

Вот мой пример запроса,

Здесь Я рассматриваю в запросе, я получу account_id = 1 и productTypes = Webinar, Intent, Summit

Таким образом, желаемым результатом будет сценарий: 1

SELECT 
    *
FROM
    test
WHERE
    account_id = 1 AND
    product_type IN ('Webinar' , 'Summit', 'Intent')
    //product_type is coming in request so I will update dynamically
    AND status IN ('Pending' , 'Inactive', 'Active', 'Completed')
ORDER BY 
    FIELD(status,
        'Pending',
        'Inactive',
        'Active',
        'Completed') , 
    FIELD(product_type,
        'Webinar',
        'Summit',
        'Intent') 
        limit 6;// as we have to show only 6 records

Я рассматриваю, что не могу достичь ожидаемого выхода с один запрос, может кто-нибудь помочь мне исправить этот запрос. Спасибо.

1 Ответ

0 голосов
/ 26 апреля 2020

Я думаю, что вы хотите гарантировать как минимум одну запись на product_type. Вы можете сделать это, используя row_number(), а затем добавить остальные условия фильтра:

order by (row_number() over (partition by product_type
                             order by field(status, 'Pending', 'Inactive', 'Active', 'Completed'), id
                            ) = 1) desc,  -- first row first for each product_type

         field(status, 'Pending', 'Inactive', 'Active', 'Completed'),
         field(product_type, 'Webinar', 'Summit', 'Intent') 
limit 6;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...