我有两个表:“用户” - >“命令”
表:用户
user_id
-----------
u1
u2
表:订单
order_id | user_id | flag
-------------------------
o1 | u1 | fA
o2 | u2 | fB
Ÿ需要获得所有用户标志计数有多少次订单“英足总
结果我需要什么:
user_id | orders
----------------
u1 | 1
u2 | 0
我尝试:
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;
但是,此查询不包括用户= U2,因为他没有与标志FA的命令;我需要的用户= U2出现有订单= 0
也许类似的东西:
SELECT
u.user_id,
COUNT(o.order_id IF o.flag IN('fA')) OR 0 AS count ...
表和数据:
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');
你可以尝试的“左连接”,这样的“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
至少有三种方法可以做到这一点:
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;
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;
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;
最快的是最后我想,但它需要在足够大的数据进行测试,看看执行计划。
你需要使用一个左外连接,而不是左连接
SELECT
u.user_id,
COUNT(o.order_id) AS orders
FROM
`user` AS u LEFT OUTER JOIN
`order` AS o USING (user_id)
WHERE
o.flag IS NULL OR
o.flag IN ('fA')
GROUP BY
u.user_id;
您可以尝试使用CASE语句。我没有MYSQL今天在这里,所以我可以验证语法,但它应该是接近这个:
SELECT u.user_id,
CASE
WHEN (SELECT COUNT (*)
FROM ORDER z
WHERE z.user_id = USER.user_id) > 0
THEN COUNT (*)
ELSE 0
END CASE AS cnt
FROM USER
GROUP BY USER.user_id;
这个查询将工作:
SELECT
u.user_id,
COUNT(o.order_id) AS orders
FROM
`user` AS u LEFT OUTER JOIN
(SELECT user_id, order_id FROM `order` WHERE flag IS NULL OR flag IN ('fA')) as o
USING (user_id)
GROUP BY
u.user_id;