2012-12-20 49 views
5

我有4個表SQL查詢是否存在以及OR操作

users 
    | id |Username| 
    | 1 | John | 
    | 2 | Mike | 
    | 3 | Alex | 

    user_contacts 
    | user_id |contact_id| 
    | 1  | 2  | 
    | 1  | 3  | 
    | 2  | 3  | 

    contact_groups 
    | id | Group name | 
    | 1 | Group 1 | 
    | 2 | Group 2 | 
    | 3 | Group 3 | 

    user_contact_groups 
    | user_id |contact_group_id| 
    | 1  | 1   | 
    | 1  | 2   | 
    | 3  | 2   | 

什麼ID喜歡做的事就是拉屬於聯絡組1和3的用戶1的聯繫人的用戶(在表:user_contacts) 。下面是代碼,但它返回查詢爲空

SELECT DISTINCT a.* from users as a 
WHERE EXISTS (SELECT * FROM user_contacts as b 
    WHERE b.user_id = 1) OR 
    (a.id IN (select c.user_id 
     FROM user_contact_groups as c 
      WHERE c.contact_group_id IN (1,3))); 
+2

應該始終返回所有行從您的'users'表,作爲第一條件你的WHERE子句實際上是一個'1 = 1'。 – Perception

+0

user_id變化。我應該用%d替換1。謝謝 – user1917451

回答

5

這是我會怎麼做,應該是最理想的:

SELECT DISTINCT u.* 
FROM users u 
LEFT OUTER JOIN user_contacts c ON u.id = c.contact_id 
    AND c.user_id = 1 
LEFT OUTER JOIN user_contact_groups g ON u.user_id = g.user_id 
    AND g.contact_group_id IN (1,3) 
WHERE c.id IS NOT NULL OR g.id IS NOT NULL 

如果你想使用EXISTS,你當然可以扭轉這個局面,但查詢可能無法使用索引(你可以刪除DISTICT此查詢):

SELECT * 
FROM users u 
WHERE EXISTS 
(
    SELECT 1 
    FROM user_contacts c 
    WHERE c.contact_id = u.id 
    AND c.user_id = 1 
) 
OR EXISTS 
(
    SELECT 1 
    FROM user_contact_groups g 
    WHERE g.user_id = u.user_id 
    AND g.contact_group_id IN (1,3) 
) 

我建議做一個解釋並看看哪一個更適合你的RDBMS。

+0

太棒了!我在上面的表中進行了更改,並試圖刪除代碼中的最後一個where子句WHERE c.id IS NOT NULL或g.id IS NOT NULL ...但stil查詢爲空。謝謝 – user1917451

+0

它的工作!我在我的代碼中出現錯誤並修復了它。感謝您的幫助。 – user1917451

+0

這是適用於我的代碼:SELECT DISTINCT a。* FROM用戶作爲LEFT JOIN user_contacts as b ON a.id = b.contact_id AND b.user_id =%d LEFT JOIN user_contact_groups as c on c.user_id = a .id和c.contact_group_id IN(%s)WHERE b.user_id IS NOT NULL或c.user_id IS NOT NULL – user1917451

3

而不是做的子查詢,你可以做左聯接

SELECT DISTINCT a.* 
FROM users as a 
LEFT JOIN user_contacts as b ON a.id = b.user_id AND a.id = 1 
LEFT JOIN user_contact_groups as c on c.user_id = a.id AND c.contact_group_id IN (1,3) 
WHERE b.user_id IS NOT NULL OR c.user_id IS NOT NULL 

我沒有在我面前SQL來測試這一點,但我認爲它會得到正確的結果

+0

感謝您的幫助,我更新了上面的表格。對不起這是我的錯。 – user1917451

+0

@ user1917451我已經更新了我的答案。不需要真正的更改,只需檢查where子句中的不同字段 – Greg

+0

這很奇怪,我仍在收到 SQL: 錯誤:查詢爲空 。與其他答案相同的結果..嗯 – user1917451

1

EXISTS運算符用於測試子查詢中是否存在任何記錄。

如果子查詢返回一個或多個記錄,則EXISTS運算符返回true。

SELECT column_name(s) FROM table_name WHERE EXISTS (SELECT column_name FROM table_name WHERE condition); 

下面的SQL語句返回TRUE,並列出了供應商與產品價格低於20:

SELECT SupplierName FROM Suppliers WHERE EXISTS (SELECT ProductName FROM Products WHERE SupplierId = Suppliers.supplierId AND Price < 20); 
相關問題