Список данных, отсортированных по количеству определенного значения

#mysql #sql

#mysql #sql

Вопрос:

Я хочу получать заказы из базы данных магазина, упорядоченные по количеству посещений стран. Это запрос, который у меня есть на данный момент:

 select /*o.id                                        as id,*/
    concat_ws(" ", oa.first_name, oa.last_name) as name,
    oa.street                                   as street,
    oa.city                                     as city,
    oa.additional_address_line1                 as additionaladdressline1,
    oa.additional_address_line2                 as additionaladdressline2,
    ct.name                                     as country,
    oa.zipcode                                  as zipcode,
    o.order_number                              as ordernumber,
    o.customer_comment                          as comment,
    /*o.sales_channel_id                          as saleschannel,*/
    oc.email                                    as email
from order_address oa
         join `order` o on o.id = oa.order_id
         join state_machine_state orderstate on o.state_id = orderstate.id and orderstate.technical_name = 'open'
         join order_customer oc on o.id = oc.order_id
         join order_transaction ot on o.id = ot.order_id
         join order_delivery od on o.id = od.order_id and oa.id = od.shipping_order_address_id
         join country c on oa.country_id = c.id
         join country_translation ct on c.id = ct.country_id
         join language l on ct.language_id = l.id
         join state_machine_state paymentstate
              on ot.state_id = paymentstate.id and paymentstate.technical_name = 'paid'
         join order_line_item oli on o.id = oli.order_id and o.version_id = oli.order_version_id
         join state_machine_state deliverystate on deliverystate.id = od.state_id
where o.order_number not in (
    select distinct o.order_number as ordernumber
    from `order` o
             join state_machine_state orderstate
                  on o.state_id = orderstate.id and orderstate.technical_name <> 'open')
  and l.name = 'Deutsch'
group by o.order_number
order by c.id, count(distinct oli.identifier) desc, sum(oli.quantity) desc
  

Это результат, который я получаю из запроса:

  -------------------- ------------------ ------------------- ------------------------ ------------------------ --------------------------------------------------- ------------ ------------- --------- ------------------------------------------------------------ 
| name               | street           | city              | additionaladdressline1 | additionaladdressline2 | country                                           | zipcode    | ordernumber | comment | email                                                      |
 -------------------- ------------------ ------------------- ------------------------ ------------------------ --------------------------------------------------- ------------ ------------- --------- ------------------------------------------------------------ 
| Nash Langosh       | Emmerich Neck    | New Korbin        | NULL                   | NULL                   | Turks- und Caicosinseln                           | 11706-2163 | 10034       | NULL    | c682bd0ff4c84988974f9435842b1fcbfriedrich61@example.org    |
| Trisha Sporer      | Hauck Neck       | Cormierchester    | NULL                   | NULL                   | Bahamas                                           | 21065-9255 | 10016       | NULL    | 702435261d53477995d6c64c3811ec58clinton.green@example.org  |
| Shana Satterfield  | Kallie Creek     | Wuckertstad       | NULL                   | NULL                   | Uganda                                            | 14142      | 10049       | NULL    | 1c390f2beee84ca8abc99f6adf79340bdiana.von@example.net      |
| Nicolette Dibbert  | Emma Burg        | Maymieton         | NULL                   | NULL                   | Uganda                                            | 15379      | 10054       | NULL    | 80a5fdca130448fe94549095ba19492fbruen.kaylee@example.net   |
| Ethelyn Runolfsson | Toy Tunnel       | Hicklefurt        | NULL                   | NULL                   | Finnland                                          | 01540-1774 | 10045       | NULL    | 84c0b38e32bf49d69220e8358bab94e2marks.dillan@example.com   |
| Euna Spencer       | Katarina Cove    | New Karinaland    | NULL                   | NULL                   | Finnland                                          | 14855      | 10009       | NULL    | bd216fe010064ccda556fd43eb52b3a4hessel.aubree@example.com  |
| Ethelyn Runolfsson | Toy Tunnel       | Hicklefurt        | NULL                   | NULL                   | Finnland                                          | 01540-1774 | 10029       | NULL    | 84c0b38e32bf49d69220e8358bab94e2marks.dillan@example.com   |
| Jamey Schamberger  | Larkin Mission   | Kobeport          | NULL                   | NULL                   | Svalbard und Jan Mayen                            | 27310-0364 | 10053       | NULL    | 50379c7b57f94639896d93fc1c563a7cbshanahan@example.net      |
| Moshe Lebsack      | Lakin Stream     | Purdystad         | NULL                   | NULL                   | Åland                                             | 67019      | 10012       | NULL    | 8fae2ae4bd0248f09c54e034c3f92eadleo89@example.com          |
| Kallie Murazik     | Kilback Junction | Tommieside        | NULL                   | NULL                   | Kleinere Inselbesitzungen der Vereinigten Staaten | 76849-7266 | 10028       | NULL    | f6ad7ba712ca463d9caed875587e421ageffertz@example.com       |
| Hank Hayes         | Kshlerin Ramp    | South Weldonshire | NULL                   | NULL                   | Gambia                                            | 06653      | 10008       | NULL    | 8537e6c081e8487ea4983a13045c6aedkelli.douglas@example.com  |
| Kallie Schmitt     | Mellie Mountains | New Blaketon      | NULL                   | NULL                   | Ecuador                                           | 41722-3737 | 10001       | NULL    | 47603affbbdd4a0b80d3233d4d41a716bsatterfield@example.org   |
| Carolyn Miller     | Therese Coves    | Venaview          | NULL                   | NULL                   | Kiribati                                          | 13115-5720 | 10006       | NULL    | 26179bb6125e4edf98e3f22225cf738fbayer.valentin@example.org |
 -------------------- ------------------ ------------------- ------------------------ ------------------------ --------------------------------------------------- ------------ ------------- --------- ------------------------------------------------------------ 
  

Как я могу отсортировать заказы по количеству вхождений в страны?

Комментарии:

1. Я не понял, что это значит frequency of countries ? Вы имеете в виду количество раз, когда страна присутствует в результирующем наборе? Если да, то что происходит с той же частотой?

2. Я имел в виду количество случаев, изменит вопрос 🙂

3. Если это одна и та же частота, на самом деле не имеет значения, как она сортируется.

4. Кстати, ваш запрос недействителен. Вы не должны группироваться по номеру заказа и при этом получать доступ к адресу, потому что в заказе может быть несколько адресов (отсюда отдельная таблица order_address). Поскольку MySQL пропускает это, вы можете ожидать неожиданных результатов. Я предлагаю вам установить режим ONLY_FULL_GROUP_BY, если у вас есть проблемы с запросами агрегации.

5. @ThorstenKettner благодаря упоминанию, что я допустил ошибку в предложении join, существует взаимно однозначная связь между order , order_delivery и order_address .

Ответ №1:

Вы хотите подсчитать страны в вашем результате и упорядочить строки в соответствии с их частотой. Используйте COUNT OVER для этого. В MySQL это доступно с версии 8.

 order by count(*) over (partition by c.id) desc, c.id