-3

可能重复:
SQL 查询如何从多个表中返回数据

我有 3 张桌子

属性

attr_id | attr_name 
1       | oval<
2       | white

产品

product_id|product_name 
1         | amazonite 
2         | agate

attr_detail

attr_detail_id | attr_id | product_id
1              | 1       | 1
2              | 2       | 1
3              | 1       | 2
4              | 2       | 2

现在我想要椭圆形和白色的产品。如何使用加入。

4

1 回答 1

1

试试这个:

SELECT DISTINCT
  p.product_id, 
  p.product_name 
FROM Product p 
INNER JOIN attr_detail ad ON p.product_id = ad.product_Id
INNER JOIN Attribute a    ON a.attr_id = ad.attr_id
WHERE a.attr_id IN(1, 2);

SQL 小提琴演示

这会给你:

| PRODUCT_ID |           PRODUCT_NAME |
---------------------------------------
|          1 |              amazonite |
|          2 |                  agate |
|          3 | Product has only white |

请注意:这将为您提供具有whiteoval形状的产品名称。但是,如果您只寻找同时具有这两种形状的产品,则必须像这样修改您的查询:

SELECT DISTINCT
  p.product_id, 
  p.product_name 
FROM Product p 
INNER JOIN
(
  SELECT product_id
  FROM attr_detail
  WHERE attr_id IN(1, 2)
  GROUP BY product_id
  HAVING COUNT(DISTINCT attr_id) = 2
) ad ON p.product_id = ad.product_Id;

更新的 SQL Fiddle 演示

这会给你:

| PRODUCT_ID | PRODUCT_NAME |
-----------------------------
|          1 |    amazonite |
|          2 |        agate |

请阅读有关JOINs 的更多信息。在这里您可以找到有关此的有用信息:

对于我在第二个查询中所做的:

  SELECT product_id
  FROM attr_detail
  WHERE attr_id IN(1, 2)
  GROUP BY product_id
  HAVING COUNT(DISTINCT attr_id) = 2

这称为关系除法

于 2012-12-29T17:51:51.513 回答