【问题标题】:MySQL - multiple conditionsMySQL - 多个条件
【发布时间】:2021-12-20 15:57:57
【问题描述】:

我有两个表:订单,商店。

商店:

shop_id | name 
-----------------------
20      | PizzaShop
34      | SushiShop

订单:

orders_id | creation_time       | user_id | shop_id | Status
------------------------------------------------------------------
1         | 2021-01-01 14:00:00 | 1       | 20      | OK
2         | 2021-02-01 14:00:00 | 1       | 34      | Cancelled
3         | 2021-03-01 14:00:00 | 1       | 20      | OK
4         | 2021-04-01 14:00:00 | 1       | 34      | OK
5         | 2021-05-01 14:00:00 | 2       | 20      | OK
6         | 2021-06-01 14:00:00 | 2       | 20      | OK
7         | 2021-07-01 14:00:00 | 2       | 34      | OK
8         | 2021-08-01 14:00:00 | 2       | 34      | OK

我需要找到每个用户的“最喜欢”的店铺,知道最喜欢的是有更多“OK”订单的店铺,并且如果有两个店铺的订单数量相同 ,然后选择具有最新订单的那个。

结果应该是这样的:

user_id | total_number_OK_orders | favourite_shop_name 
------------------------------------------------------------------
1       | 3                      | PizzaShop
2       | 4                      | SushiShop

我不知道如何做第二列。首先,这是我目前拥有的:

SELECT 
    orders.user_id,
    SUM(if(orders.Status = 'OK', 1, 0)) AS total_number_OK_orders
FROM orders
LEFT JOIN shops
    ON orders.shop_id = shops.shop_id
GROUP BY orders.user_id;

【问题讨论】:

  • 你的MySql是什么版本的?
  • 你已经问过这个问题了。
  • @Shadow 我不知道这个问题的要求之前是否已经回答过,但可以肯定的是,您提出的重复链接不能提供完整的解决方案。
  • @forpas 我不同意,重复的问题是关于获得每组的最大计数,这正是这个问题的意义所在。 OP 设法获得了简单的条件计数,因此不需要单独的答案。
  • @Shadow 问题不是如何找到每个用户最喜欢的商店。这将使它成为许多问题的重复。问题是如何在同一个查询中组合两个不同的结果,其中之一是如何找到每个用户最喜欢的商店。如果其中 1 个(或两个)结果都已解决,这并不意味着它们的组合也已解决。

标签: mysql group-by sum left-join window-functions


【解决方案1】:

对于 MySql 8.0+,您可以使用窗口函数 SUM()FIRST_VALUE()

SELECT DISTINCT o.user_id, 
       SUM(SUM(o.Status = 'OK')) OVER (PARTITION BY o.user_id) total_number_OK_orders,
       FIRST_VALUE(s.name) OVER (PARTITION BY o.user_id ORDER BY SUM(o.Status = 'OK') DESC, MAX(o.creation_time) DESC) favourite_shop_name 
FROM orders o LEFT JOIN shops s
ON s.shop_id = o.shop_id AND o.Status = 'OK'
GROUP BY o.user_id, s.shop_id;

请参阅demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-16
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2014-09-11
    • 2020-05-31
    相关资源
    最近更新 更多