在SQL中選擇同一列上符合多個條件的記錄
SQL查詢有時需要檢索在同一列上符合多個條件的記錄。但是,簡單地使用多個具有相同列的WHERE子句並不總是能產生預期的結果。考慮以下範例:
我們有一個包含聯絡人和指示每個聯絡人狀態的標誌的資料庫表。表格包含以下數據:
ID | contactid | flag | flag_type |
---|---|---|---|
118 | 99 | Volunteer | 1 |
119 | 99 | Uploaded | 2 |
120 | 100 | Via Import | 3 |
121 | 100 | Volunteer | 1 |
122 | 100 | Uploaded | 2 |
目標是僅傳回同時符合「Volunteer」和「Uploaded」標誌條件的聯絡人ID。使用以下查詢:
<code class="language-sql">SELECT contactid WHERE flag = 'Volunteer' AND flag = 'Uploaded'</code>
將不會傳回任何結果,因為每個條件只檢查一個特定的標誌值。要檢索所需數據,我們需要使用替代方法。
使用GROUP BY和HAVING
一種解決方案是使用GROUP BY和HAVING子句。以下查詢將依contactid分組結果並計算符合標誌值的個數:
<code class="language-sql">SELECT contact_id FROM your_table WHERE flag IN ('Volunteer', 'Uploaded') GROUP BY contact_id HAVING COUNT(*) = 2 -- 必须与WHERE flag IN (...)列表中的数字匹配</code>
同時具有「Volunteer」和「Uploaded」標誌的聯絡人將計數為2。然後,HAVING子句過濾結果,只包括這些聯絡人。
使用連線
另一種方法是使用連接。以下查詢將在your_table表上執行自連線:
<code class="language-sql">SELECT T1.contact_id FROM your_table T1 JOIN your_table T2 ON T1.contact_id = T2.contact_id AND T2.flag = 'Uploaded' -- // 如果需要,可以添加更多连接 WHERE T1.flag = 'Volunteer'</code>
此查詢將建立一個臨時表,其中包含同時具有「Volunteer」和「Uploaded」標誌的所有聯絡人的組合。然後,WHERE子句過濾結果,只包括滿足這兩個條件的聯絡人。
方法選擇
選擇具有同一列上多個條件的記錄的最佳方法取決於資料的規模和結構。對於具有很長匹配條件清單的大型資料集,GROUP BY和HAVING解決方案可能更有效。對於具有較短匹配條件清單的小型資料集,JOIN解決方案可能更快。
以上是如何在SQL中選擇與同一列上的多個條件相符的記錄?的詳細內容。更多資訊請關注PHP中文網其他相關文章!