2012-11-12 129 views
2

這是一個如此簡單的問題,但由於某種原因,今天我無法把頭轉向它。根據所有孩子的身體狀況選擇父母

我有兩個實體: - titleproduct,每個分別命名爲tbl_titletbl_product。每個title可以有許多products

該產品表有一個名爲unwanted的字段,該字段可以是null01

我要選擇的基礎上,所有product S(ALL)有unwanted設置爲1所有title秒。所以換句話說,我希望根據所有滿足特定條件的孩子選擇父母。所以如果一個title有一個productunwanted但另一個不是我不希望這個title輸入結果集。

當我嘗試這個,我得到了我的頭的最多的是:

SELECT * FROM `tbl_title` 
    left join tbl_product on tbl_product.title_id = tbl_title.id 
    where tbl_product.unwanted = 1 
    group by tbl_title.id 

這顯然是行不通的。

那麼如何編碼這樣的查詢?

+0

你的描述與你的標題不同。如果所有的孩子都有條件或者只有一個 –

+0

@juergend所有描述標題和描述中的「全部」的孩子 – Sammaye

+0

'所以如果一個標題有一個不想要的產品,但另一個不是,我希望這個標題進入結果集。「這是什麼意思? –

回答

2
select * from tbl_title 
where id not in (select title_id from tbl_product where unwanted = 0) 

在英語中,這個查詢消除了有希望所有冠軍產品。


從外觀風格來看,這將是更好打電話給你列wanted,因爲unwanted = 0wanted = 1雙負。讓你的頭腦保持積極樂觀總是更容易。

+0

我需要測試這個,因爲如果一個標題ID同時包含不需要的產品和想要的產品,它會不會從子選擇中返回title_id? – Sammaye

+0

@Sammaye號碼任何'unwanted = 0'的出現都會導致該標題不被選擇。然而,該查詢將返回沒有任何產品的標題。如果這不是你的意圖,請告訴我 - 它可以很容易地修復 – Bohemian

+0

的確,因爲當然你正在繼續title_id,我沒有看到,經過一些調整和測試後,它似乎返回了比上面的答案多7個結果,我將需要測試這一點,並找出哪個是最好的,謝謝:) – Sammaye

1

嘗試使用子查詢是這樣的:

SELECT * FROM `tbl_title` AS t 
WHERE EXISTS (SELECT 1 FROM products WHERE title_id = t.id AND unwanted = 1) 
AND NOT EXISTS (SELECT 1 FROM products WHERE title_id = t.id AND (unwanted = 0 OR unwanted IS NULL)) 
+0

有人不明白'EXISTS'已經低估了這一點。這有效,沒有錯。 – nawfal

+0

+1給櫃檯。你也可以在內部select中使用'*'而不是'1',因爲它沒有區別。 – nawfal

+0

雖然比juergen的答案慢了許多(而且重得多),但它確實返回了相同的結果。 – Sammaye

2
SELECT t.id 
FROM `tbl_title` t 
left join tbl_product p on p.title_id = t.id 
group by t.id 
having sum(p.unwanted = 0 or p.unwanted is null) = 0 
+0

啊哈,現在這是一個有趣的迴應,謝謝! – Sammaye

+0

+1使用HAVING來解決問題。尼斯。 – davidethell

0

只爲字段title

SELECT * 
FROM  `tbl_title` AS t 
JOIN  tbl_product AS v ON t.id = v.title_id 
WHERE NOT EXISTS(
        SELECT * 
        FROM tbl_product 
        WHERE (t.id = title_id) 
         AND (unwanted = 0 OR unwanted IS NULL) 
GROUP BY t.id 
+0

我認爲這仍然會遇到與Kaii的回答相同的問題,即子查詢會帶來不正確的結果。它適用於只有一種不需要的產品的標題,但它不適用於多個產品。 – Sammaye

+0

@Sammaye我猜想一些錯誤的理解。我現在測試了它,它工作。你試過了嗎? – nawfal

+0

@Sammaye你說得對,這會帶來不必要的記錄,但你錯誤地表述了它。我會刪除這個,因爲如果我糾正這個問題,它將變得非常殘忍davidethell的回答 – nawfal