2015-10-13 63 views
0

案例: 我想已經COMPANY_ID 8和13,但所有的公司,只有當他們都product_ids(1,2,4,8)。選擇行,其中樞軸具有所有的ID

問題: company_id 13沒有product_id 4和8,但仍顯示在查詢結果中,如下所示。似乎cp.product_id IN(1,2,4,8)返回公司,如果它有這些值之一,但我需要他們在透視表company_products中具有所有這些值。

SELECT 
    c.id as company_id, 
    cp.product_id 
FROM 
    `companies` as c 
    LEFT JOIN `company_products` cp ON cp.company_id = c.id 
WHERE 
    c.id IN (8, 13) 
    AND cp.product_id IN (1,2,4,8) 
GROUP BY 
    c.id 

我的猜測是我應該使用IN以外的東西,但是我的研究並沒有讓我找到正確的解決方案。感謝您的幫助。

+0

當您說「_all所有擁有company_id 8和13_的公司」時,假設您確實是指「_company_id 8 OR 13_」是否正確?布爾值和/或在這裏是重要的,'IN()'用作'OR'。我明白你的問題的部分內容,但其他WHERE條件需要澄清。如果您將輸入行樣本與該輸入樣本中的輸出行一起提供,那麼這將有所幫助,因此我們無需進行任何推理。 –

+0

在我的代碼中,我已經確定我想company_id 8和13.我想過濾這兩家公司的條件是具有所有給定的product_id –

回答

2

你可以一個having條款添加到您的查詢,以確保每一個組c.id有四個cp.product_id:

SELECT 
    c.id as company_id 
FROM 
    `companies` as c 
    LEFT JOIN `company_products` cp ON cp.company_id = c.id 
WHERE 
    c.id IN (8, 13) 
    AND cp.product_id IN (1,2,4,8) 
GROUP BY 
    c.id 
HAVING COUNT(DISTINCT cp.product_id) = 4;  

Sample SQL Fiddle

如果您所需要的產品細節,你也可以將上述查詢用作派生表並將其與產品表結合使用。

+0

該解決方案的工作原理雖然看起來在此解決方案中,但我將使用額外子句,而不是我應該(或可能)使用與IN不同的運算符。感謝您的解決方案。 –

+0

這是該問題的常見解決方案,因爲您需要一個組來確定是否所有人都存在,並且在組後面應用「HAVING」。沒有辦法直接在'WHERE'中應用它,因爲它仍在按行運行。 –

+0

@ChrisHessler據我所知,沒有任何運算符會做你想做的事情,因爲where子句在一行上操作,但你想要一次評估多行(你必須使用group by/having)。另一種方法是對company_product表使用多個連接,但效率不高。使用'intersect'的其他數據庫應該是另一個(sub par)選項。 – jpw