0

我不擅长进行 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 

假设我想购买上面有钻石的黑色/超大号 T 恤。然后product_combination必须是黑色/大号/钻石排。我想我需要一个具有多对多关系的 Foreign 表。像 product_combination_option 表的列:

 product_combination_option
 - product_combination_option_id
 - product_combination_id
 - product_option_id

但话又说回来。当有人选择带钻石的黑色/超大号并找到它时,我如何查询product_combination

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

4

2 回答 2

0

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

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

这将连接 2 个表。因此您可以将 * 替换为要显示/获取的属性列表。

于 2013-08-23T22:50:27.967 回答
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它的列包含请求的选项。

于 2013-08-24T20:12:38.300 回答