1

假设我有两张桌子:

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. 匹配我列表中的任何语言('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

如果您不能为同一产品使用两次 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 回答