【问题标题】:Performing an INNER JOIN across 2 tables with COUNT()使用 COUNT() 跨 2 个表执行 INNER JOIN
【发布时间】:2013-03-03 07:17:48
【问题描述】:

我遇到了一个 SQL 查询问题,希望你们能帮助我。

我有 2 张桌子:

EVENTS
event_id (PK)
event_name

ORDERS
order_id (PK)
event_id (FK)

我正在尝试对这些表执行以下查询:

SELECT
    e.event_id,
    e.name,
    COUNT(o.event_id) AS booked     
FROM
    events AS e
INNER JOIN
    orders AS o
ON
    e.event_id = o.event_id
WHERE
    e.event_id IN (1, 2, 3)

问题是我得到的结果是:

+----------+------+--------+
| event_id | name | booked |
+----------+------+--------+
|     NULL | NULL |      0 |
+----------+------+--------+

但是当我运行 3 个单独的查询时:

WHERE e.event_id IN (1)

WHERE e.event_id IN (2)

WHERE e.event_id IN (3)

我得到了我想要的结果:

+----------+-------+--------+
| event_id | name  | booked |
+----------+-------+--------+
|       1  | Test1 |      0 |
+----------+-------+--------+

+----------+-------+--------+
| event_id | name  | booked |
+----------+-------+--------+
|       2  | Test2 |      0 |
+----------+-------+--------+

+----------+-------+--------+
| event_id | name  | booked |
+----------+-------+--------+
|       3  | Test3 |      0 |
+----------+-------+--------+

我做错了什么?有没有办法只使用一个查询并获取:

+----------+-------+--------+
| event_id | name  | booked |
+----------+-------+--------+
|       1  | Test1 |      0 |
+----------+-------+--------+
|       2  | Test2 |      0 |
+----------+-------+--------+
|       3  | Test3 |      0 |
+----------+-------+--------+

请帮忙。

更新: 当我跑步时:

SELECT
    e.event_id,
    e.name,
    COUNT(o.event_id) AS booked     
FROM
    events AS e
LEFT JOIN
    orders AS o
ON
    e.event_id = o.event_id
WHERE
    e.event_id IN (1, 2, 3)

我只得到:

+----------+-------+--------+
| event_id | name  | booked |
+----------+-------+--------+
|       1  | Test1 |      0 |
+----------+-------+--------+

【问题讨论】:

    标签: mysql sql join count


    【解决方案1】:

    您应该使用LEFT JOIN 而不是INNER JOIN,并且不要忘记使用GROUP BY 子句,因为您正在使用聚合函数 COUNT()

    SELECT  e.event_id,
            e.name,
            COUNT(o.event_id) AS booked     
    FROM    events AS e
            LEFT JOIN orders AS o
                ON e.event_id = o.event_id
    WHERE   e.event_id IN (1, 2, 3)
    GROUP   BY e.event_id, e.name
    

    如需进一步了解联接,请访问以下链接:

    【讨论】:

    • 感谢您的帮助。两个答案都是正确的,但你是第一个:)
    【解决方案2】:

    使用带有 if 条件的左连接可以做到这一点

    SELECT
      e.event_id,
      e.name,
      SUM(IF(o.event_id IS NULL, 0, 1)) AS booked
    FROM events AS e
      LEFT JOIN orders AS o
        ON e.event_id = o.event_id
    WHERE e.event_id IN(1, 2, 3)
    GROUP   BY e.event_id, e.name
    

    Fiddle Demo

    或者你也可以这样做

    SELECT
      e.event_id,
      e.name,
      COUNT(o.event_id) AS booked
    FROM events AS e
      LEFT JOIN orders AS o
        ON e.event_id = o.event_id
    WHERE e.event_id IN(1, 2, 3)
    GROUP BY e.event_id, e.name
    

    SQL Fiddle Demo

    【讨论】:

    • COUNT 足够时,为什么还要使用附加条件? :D
    猜你喜欢
    • 1970-01-01
    • 2021-03-08
    • 2015-03-19
    • 2019-12-05
    • 2014-11-12
    • 2012-06-15
    • 2023-04-07
    • 1970-01-01
    • 2012-10-24
    相关资源
    最近更新 更多