MySQL计数条件子表行

3 mysql conditional count left-join

我有两个表:“用户”->“订单”

表格:用户

user_id
-----------
    u1
    u2
Run Code Online (Sandbox Code Playgroud)

表格:订单

order_id | user_id | flag
-------------------------
    o1   |    u1   |  fA
    o2   |    u2   |  fB
Run Code Online (Sandbox Code Playgroud)

您需要获得所有用户计数带有标志“ fA”的订单的次数

我需要的结果:

user_id | orders
----------------
   u1   |   1
   u2   |   0
Run Code Online (Sandbox Code Playgroud)

我尝试:

SELECT
    u.user_id,
    COUNT(o.order_id) AS orders
FROM
    `user` AS u LEFT JOIN
    `order` AS o USING (user_id)
WHERE
    o.flag IS NULL OR
    o.flag IN ('fA')
GROUP BY
    u.user_id;
Run Code Online (Sandbox Code Playgroud)

但是,此查询不包括user = u2,因为他没有带有标志fA的订单;我需要user = u2order = 0一起出现

也许是这样的:

SELECT
    u.user_id,
    COUNT(o.order_id IF o.flag IN('fA')) OR 0 AS count ...
Run Code Online (Sandbox Code Playgroud)

表格和数据:

CREATE TABLE `user` (user_id VARCHAR(2) NULL);
CREATE TABLE `order` (order_id VARCHAR(2) NULL,user_id VARCHAR(2) NULL,flag VARCHAR(2) NULL);
INSERT INTO `user` VALUES ('u1'), ('u2');
INSERT INTO `order` VALUES ('o1','u1','fA'),('o2','u2','fB');
Run Code Online (Sandbox Code Playgroud)

小智 5

您可以尝试在“ LEFT JOIN”的“ ON”语句中使用条件,如下所示:

SELECT u.user_id, COUNT(o.user_id)
FROM user u
LEFT JOIN `order` o ON u.user_id = o.user_id AND o.flag = 'fA'
GROUP BY user_id
Run Code Online (Sandbox Code Playgroud)

SQLFiddle中的运行示例


Rus*_*nko 5

至少有三种方法可以做到这一点:

  1. 只需使用依赖子查询即可。

    SELECT u.user_id, (SELECT count(user_id) FROM `order` o WHERE o.user_id = u.user_id AND o.flag = 'fA') count
    FROM `user` u;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在子查询上使用LEFT JOIN

    SELECT u.user_id, count(o.user_id) count
    FROM `user` u
    LEFT JOIN (SELECT user_id FROM `order` WHERE flag = 'fA') o USING (user_id)
    GROUP BY u.user_id;
    
    Run Code Online (Sandbox Code Playgroud)
  3. LEFT JOIN组合条件下使用:

    SELECT u.user_id, count(o.user_id) count
    FROM `user` u
    LEFT JOIN `order` o ON o.user_id = u.user_id AND o.flag = 'fA'
    GROUP BY u.user_id;
    
    Run Code Online (Sandbox Code Playgroud)

我认为最快的是最后一个,但它需要在足够大的数据上进行测试并查看执行计划。

SQL小提琴