与MySQL的条件算子表行

问题描述 投票:3回答:5

我有两个表:“用户” - >“命令”

表:用户

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');
mysql count conditional left-join
5个回答
5
投票

你可以尝试的“左连接”,这样的“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

Runing example in SQLFiddle


2
投票

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

  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;
  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;
  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;

最快的是最后我想,但它需要在足够大的数据进行测试,看看执行计划。

SQL Fiddle


1
投票

你需要使用一个左外连接,而不是左连接

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;

1
投票

您可以尝试使用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;

1
投票

这个查询将工作:

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;
© www.soinside.com 2019 - 2024. All rights reserved.