2012-04-22 73 views
0

我正在查找一個SQL查詢,該查詢將返回1或零,具體取決於聯接的行的內容。僅加入特定行

兩個表:

活動:

  • EVENT_ID
  • 描述

預選賽:

  • qualifier_id
  • EVENT_ID
  • qualifier_type

每個事件可以有多個限定符。

,我目前擁有的查詢是:

select event_id, if(qualifier_type = 15, 1, 0) 
from events 
join qualifiers q using (event_id) 
where q.qualifier_type = 15; 

在一個完美的世界,我會很好地規範這些表,並把不同的預選賽與事件,但是這是不可能的時刻。

編輯:目前,此查詢只返回具有關聯的行。相反,我需要返回所有行以及一個指定此關聯是否存在的額外列。

+0

你目前的查詢有什麼問題?您是否在查找事件列表以及是否需要對該事件進行限定符類型15的指示? – 2012-04-22 20:51:04

回答

1
SELECT e.event_id, COUNT(q.qualifier_type) AS needs_qualtype_15 
    FROM events AS e 
    LEFT JOIN qualifiers AS q ON q.event_id = e.event_id AND q.qualifier_type = 15 
GROUP BY e.event_id 

這給你的所有事件的列表,並表明限定符類型15是否與該事件相關聯。

寫同樣的事情的另一種方法是:

SELECT e.event_id, COUNT(q.qualifier_type) AS needs_qualtype_15 
    FROM events AS e 
    LEFT JOIN 
     (SELECT event_id, qualifier_type 
      FROM qualifiers WHERE qualifier_type = 15 
     ) AS q 
    ON q.event_id = e.event_id 
GROUP BY e.event_id; 

這兩種製劑依靠COUNT(expr)只計算非空值。對於匹配限定符的事件,COUNT爲1;對於沒有的事件,它是0.第一個版本通過將限定符類型的條件包含到ON連接條件中來壓縮查詢。第二個版本更清晰,但更詳細。很可能優化器會以相同的方式執行兩個查詢。

+0

取而代之的是,我需要一個** all **事件的列表 - 帶有一個額外的列,指定是否有一個類型爲15的限定符與該事件相關聯。 – devinpleuler 2012-04-22 21:00:21

+0

@fluorescentLAMP:這兩個應該給你一個**所有**事件的列表,因爲事件表是左外連接中佔統治地位或保留的表。在連接之後沒有額外的過濾器,所以所有的事件都會被保留下來:如果一個事件在限定符類型爲15的限定符中有一行,COUNT(q.qualifier_type)將會生成1;如果事件在限定符中沒有適當的行,則LOJ將生成一個等效於'(event_id,NULL)'的條目,並且COUNT將生成0. – 2012-04-22 21:04:45

+0

太棒了。我第一次錯過了左連接。非常感謝! – devinpleuler 2012-04-22 21:09:43

0
Case 
    When qualifier_type = 15 then 0 
    Else 1 
End 

這裏更多,http://dev.mysql.com/doc/refman/5.0/en/case-statement.html

+0

這仍然會爲每個事件返回多行。 – devinpleuler 2012-04-22 20:54:11

+0

由於問題標記爲MySQL,可能MS SQL Server引用不是最好的信息來源,儘管CASE表達式是標準SQL,因此在大多數DBMS中類似。 – 2012-04-22 20:54:38

+0

@熒光燈LAMP,使用獨特的獨特行。取決於你的表結構,儘管你仍然可能得到兩行(一個1和一個0)的相同的事件ID。 – 2012-04-22 20:59:53

0

並不完全清楚你以後,但試試這個:

SELECT DISTINCT 
    event_id, 
    CASE WHEN qualifier_type IS NULL THEN 0 ELSE 1 END AS [ColumnName] 
FROM events 
LEFT JOIN qualifiers q 
WHERE q.qualifier_type = 15;