2012-06-04 64 views
1

假設我有兩個表:匹配的特定一個對許多條目與SQL

product 
------- 
productid 
name 

language 
-------- 
productid 
code 

我有三個產品:

1, 'homebody' -> 1, EN 
2, 'continetnal' -> 2, FR 
       -> 2, EN 
       -> 2, ES 
3, 'westy'  -> 3, EN 
       -> 3, ES 
       -> 3, FR 
       -> 3, PT 
4, 'oktoberfest' -> 4, DE 

假設我有一個我感興趣的語言列表EN, FR, ES我想創建三種類型的查詢來選擇一些產品。

  1. 比賽在我的列表中的任何語言( '安土重遷', '大陸', 'westy')
  2. 比賽在我的列表中的所有語言( '大陸', 'westy')
  3. 嚴絲合縫的語言我的名單(「大陸」)

我認爲解決第一個就是:

SELECT * FROM products AS p JOIN language AS l ON (p.productid = l.productid) WHERE l.code IN ('EN', 'ES', 'FR') 

什麼是爲我解決鄰的好辦法有沒有問題?我懷疑某些地方會計算與我的產品相關的語言數量,並確保它與我的查詢中的語言數量相同或至少是相同,但不知道如何實現此目的。

+0

如果你可以找出更好的問題標題,盡一切編輯。 –

回答

2

,如果你不能有相同的產品兩次FR(或任何語言):

2.

SELECT p.productid, p.name 
FROM products AS p 
JOIN language AS l ON (p.productid = l.productid) 
WHERE l.code IN ('EN', 'ES', 'FR') 
GROUP BY p.productid, p.name 
HAVING COUNT(*) = 3 

3.

WHERE l.code IN ('EN', 'ES', 'FR') 
AND NOT EXISTS (SELECT NULL FROM language where productid = p.productid 
    AND code NOT IN ('EN', 'ES', 'FR') 
GROUP BY p.productid, p.name 
HAVING COUNT(*) = 3 

,或者如果你想找回語言代碼

SELECT * FROM products p 
JOIN language l on p.productid = l.productid 
where p.productid IN 
    (SELECT p1.productid from product p1 
    JOIN language AS l1 ON (p1.productid = l1.productid) 
    WHERE l1.code IN ('EN', 'ES', 'FR') 
    GROUP BY p1.productid, 
    HAVING COUNT(*) >= 3) 
+0

謝謝。 「count(*)= 3」正在返回'continental'和'westy'。 –

+0

你是對的,我很愚蠢。 1秒^^ –

+0

嘿!我想我明白了爲什麼,但我相信你可以比我更快地獲得語法。 –

-2

以下解決方案如何?

  1. 比賽在我的列表中的任何語言( '安土重遷', '大陸', 'westy')

    select p.* from product p, language l 
    where p.productid = l.productid 
        and l.code in ('homebody', 'continental', 'westy') 
    
  2. 比賽在我的列表中的所有語言( '大陸', 'westy')

    select distinct p.* from product p, product p2, language l 
    where p.productid = l.productid 
        and l.code in ('continental', 'westy') 
        and p.productid = p2.productid 
    
  3. 嚴絲合縫我的列表中的語言( '大陸')

    select p.* 
        from product p, language l 
    where p.productid = l.productid 
        and l.code in ('continental') 
    
+0

名單是EN,ES,FR - homebody,continental和westy顯示了預期的結果。 – SarekOfVulcan