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 = u2与order = 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)
至少有三种方法可以做到这一点:
只需使用依赖子查询即可。
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)在子查询上使用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)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)我认为最快的是最后一个,但它需要在足够大的数据上进行测试并查看执行计划。
| 归档时间: |
|
| 查看次数: |
8529 次 |
| 最近记录: |