2013-03-03 52 views
1

我被困在SQL查詢中,我希望你們能幫助我。使用COUNT執行2個表的INNER JOIN()

我有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 | 
+----------+-------+--------+ 

請幫忙。

UPDATE: 當我運行:

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

您應該使用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 

爲了進一步獲得更多的知識有關加入,請訪問以下鏈接:

+0

感謝您的幫助。兩個答案都是正確的,但你是第一個:) – n1te 2013-03-03 07:28:15

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 

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

+0

爲什麼使用額外的條件'COUNT'就足夠了? ':D' – 2013-03-03 07:26:24

+0

感謝您的幫助 – n1te 2013-03-03 07:27:38