1

2 つのテーブルがあるとします。

product
-------
productid
name

language
--------
productid
code

私は3つの製品を持っています:

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、いくつかの製品を選択するために 3 種類のクエリを作成したいとします。

  1. リスト内の任意の言語に一致 ('homebody'、'continental'、'westy')
  2. リスト内のすべての言語に一致 ('continental'、'westy')
  3. リスト内の言語に正確に一致 (「大陸」)

最初の解決策は次のとおりだと思います。

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

他のクエリを解決するための良い方法は何ですか? 製品に関連付けられている言語の数を数えて、それがクエリ内の言語の数と同じか、少なくとも言語の数であることを確認していると思われますが、これを実現する方法がわかりません。

4

2 に答える 2

2

同じ商品に 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)
于 2012-06-04T21:02:50.223 に答える
-2

以下の解決策はいかがですか?

  1. リスト内の任意の言語に一致 ('homebody'、'continental'、'westy')

    select p.* from product p, language l 
     where p.productid = l.productid
       and l.code in ('homebody', 'continental', 'westy')
    
  2. リスト内のすべての言語に一致 ('continental'、'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')
    
于 2012-06-04T23:51:41.707 に答える