2012-10-15 49 views
1

由於我正在尋找一個例子,考慮下面的例子水果表加入同一個表


id user_id  fruit   type   

1 43  apple   fresh 
2 87  watermelon  fresh 
3 99  apple   fresh 
4 43  pineapple  dried 
5 60  pineapple  dried 
6 60  lemon   fresh 
7 99  kiwi   fresh 
8 43  mango   fresh 

我想找到同時包含「蘋果」的所有用戶的所有記錄,「乾燥「在同一張表中(不一定在同一行中)。同一個用戶必須具備這兩個條件。

什麼,我想回的是:


id user_id  fruit   type   

1 43  apple   fresh 
4 43  pineapple  dried 

我試過自我的幾種組合聯接:


SELECT distinct f1.*, f2.* 
FROM orders f1 FULL JOIN orders f2 
ON f1.user_id = f2.user_id 
WHERE f1.fruit ILIKE 'apple' 
AND f2.type ILIKE 'dried' 

,但一直沒能得到它完全正確。

這是一個Rails應用程序,所以我很想用ActiveRecord來做到這一點,但如果需要的話,我會很樂意使用普通的SQL。

有關如何做到這一點的任何建議? TIA

回答

2

這應該爲你做它:

SELECT 
    * 
FROM 
    Fruits 
WHERE 
    (Fruit = 'apple' 
OR Type = 'dried') 
AND 
    EXISTS 
    (SELECT 
     NULL 
    FROM 
     FRUITS F1 
     INNER JOIN Fruits F2 ON F1.User_ID = F2.User_ID AND F1.Fruit = 'apple' and F2.Type = 'dried' 
    WHERE 
     Fruits.user_ID = F1.User_ID) 
+0

嗨。與我上面的評論相同:這給我所有3條記錄(1,4和8),而不是隻搜索了2條記錄(1和4) – purplerice

+0

@purpleice我已編輯添加附加位置條款。當你說你想要所有在同一張桌上同時擁有蘋果和幹蘋果的用戶的所有記錄時,你並不十分清楚。你沒有提到你只想要包含蘋果或乾的行 - 見這裏的工作示例http://www.sqlfiddle.com/#!2/37dcd/6 – Tobsey

+1

謝謝 - 這正是我正在尋找。對不起,我沒有更清楚 - 我給出了我期待的結果,因爲它並不總是很容易解釋。再次感謝! – purplerice

2
SELECT 
    orders.* 
FROM 
    orders 
INNER JOIN 
    (SELECT user_id FROM orders WHERE fruit = 'apple' GROUP BY user_id) AS apple_buyers 
    ON apple_buyers.user_id = orders.user_id 
INNER JOIN 
    (SELECT user_id FROM orders WHERE type = 'dried' GROUP BY user_id) AS dried_buyers 
    ON dried_buyers.user_id = orders.user_id 
+0

感謝您的答覆,但差不多。這給了我user_id的所有3條記錄,而不僅僅是特定的2條(我回來的記錄ID#1,4和8而不是#1,4。 – purplerice

+2

@purpleice - 只需添加WHERE命令。根據你的索引*(我推薦[user_id,fruit] **和** [user_id,type]索引)*和你特定的RDBMS,不同的查詢會有不同的表現,這可能會或可能不會比Tobsey相關的子查詢版本更快,您需要使用代表實時環境的數據在您的真實環境中進行測試 – MatBailie

+0

這也很好,我選擇了正確的答案是先給出,但我希望我也可以接受你的,而不是隻有+1。謝謝你。 – purplerice

1
select TAB1.id,TAB1.user_id,TAB1.fruit,TAB1.types 

FROM 
(select id,user_id,fruit,types 
from IID T1 WHERE T1.fruit='apple' OR T1.types ='dried')TAB1 

    INNER JOIN 

(select user_id,count(user_id) AS CNT_user_id 
    from IID T1 WHERE T1.fruit='apple' OR T1.types ='dried' 
    group by user_id 
    having count(user_id) >=2)TAB2 

    ON(TAB1.user_id=TAB2.user_id) 

id user_id fruit  types 
4  43  pineapple dried 
1  43  apple  fresh 
0
SELECT A.id , A.user_id,A.fruit,A.types FROM iid A 
WHERE user_id IN(
    SELECT A.user_id FROM 
    (
     SELECT user_id FROM iid 
     WHERE types='dried' 
    )A 
INNER JOIN 
    (
     SELECT user_id FROM iid WHERE fruit = 'apple' 
    )B 
ON A.user_id=b.user_id) 
AND (fruit='apple' OR types='dried')