1

私は 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 |
+----------+-------+--------+

私は何を間違っていますか?クエリを 1 つだけ使用して取得する方法はありますか。

+----------+-------+--------+
| 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 |
+----------+-------+--------+
4

2 に答える 2

4

集約関数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

結合についてさらに詳しく知りたい場合は、以下のリンクにアクセスしてください。

于 2013-03-03T07:19:21.413 に答える
1

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

フィドルのデモ

または、このようにすることもできます

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 フィドルのデモ

于 2013-03-03T07:24:21.397 に答える