查询通向其他表中一行的多行

时间:2013-08-23 22:29:50

标签: mysql sql

我在制作mySQL查询方面是一个菜鸟,所以我无法完成我的工作。我希望你们知道我的问题的答案。

我想为我的产品做出选择。就像你有一件黑色T恤,上面有一个背心模型和钻石。你必须有黑色T恤背心模型和钻石排。我想这样做:

table: product_option
--------------------------------
product_option_id   name    product_combination_id
1                   Black   1
2                   Diamond 1
3                   Tanktop 1
4                   Option  2
5                   Option  2

table: product_combination
--------------------------------
product_combination_id   name                         
1                        Black tanktop with diamonds

所以我的问题是。是否可以查询product_options并从中获取product_combination行?

我希望你们知道我的问题的答案!谢谢您的时间:))

编辑:

我认为我的问题过于笼统,我想更具体地问一下。

让我们说吧。我有一个衣服的商店。我有一个产品(比方说一件T恤)。还有几个选项可供选择。

像这样:

Color:
- Black
- Red
- Orange

Size
- Large
- Xtra Large
- Medium
- Small

Accessoire:
- Diamonds
- Printed
- Swarovski 

假设我想购买带钻石的黑色/ Xtra大号T恤。那么product_combination必须是黑/大/钻石行。我想我需要一个具有多对多关系的外表。与product_combination_option表一样,列为:

 product_combination_option
 - product_combination_option_id
 - product_combination_id
 - product_option_id

但话又说回来。当有人选择Black / Xtra Large with Diamonds并查找product_combination时,我该如何查询。

我希望我现在更清楚一点。对不起,我这么晚才更新我的问题!我非常感谢你的所有答案!

2 个答案:

答案 0 :(得分:0)

我认为您正在寻找的是加入您的桌子,以便您可以根据您拥有的产品选择组合。
所以,为此,查询可以是

Select * 
from product_option inner join product_combination
using(product_combination_id);

这加入了2个表。所以你可以用你要显示/获取的属性列表替换*。

答案 1 :(得分:0)

如果您的意思是想要将一个选项列表传递给查询并获得匹配的product_combination条目列表,那么这是一种方式:

SELECT *
FROM product_combination
WHERE product_combination_id IN (
  SELECT product_combination
  FROM product_option
  WHERE name IN ('option1', 'option2', 'option3')
  GROUP BY product_combination
  HAVING COUNT(*) = 3
);

子查询返回一组product_combination个值,这些值包含所有请求的三个选项。 COUNT(*) = 3条件假定单个product_combination值不能与其关联的重复name值。 (这很自然,但是如果您的表没有相应的限制,您可以用COUNT(*)替换COUNT(DISTINCT name)以确保返回的组包含指定的所有三个选项而不仅仅包含三行其中一些包含相同的选项。)

当然,如果查询的选项数量不固定,则需要根据IN谓词动态构建查询,因为它不具有参数(就项目数而言)。但是,您可以尝试使用临时行集而不是硬编码列表。在运行有问题的查询之前,将填充该表,在这种情况下,该表将被修改为此效果:

SELECT *
FROM product_combination
WHERE product_combination_id IN (
  SELECT product_combination
  FROM product_option
  WHERE name IN (SELECT option_name FROM requested_options)
  GROUP BY product_combination
  HAVING COUNT(*) = (SELECT COUNT(*) FROM requested_options)
);

在上面的查询中,requested_options是临时存储的名称(可能是一个临时表,但我不确定MySQL是否允许您访问已创建并在其他查询中预先填充的一个),option_name是包含所请求选项的列。