#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