我正在尝试构建一个查询,其中我获得了内容与搜索匹配的所有变体。 例如,根据下表,我想获得包含内容的所有变体=" red"
-------------------------------------------
| ID | Product | Variant | Option | Content |
-------------------------------------------
| 1 | Shirt | 1 | size | S |
| 2 | Shirt | 1 | color | red |
| 3 | Shirt | 2 | size | M |
| 4 | Shirt | 2 | color | red |
| 5 | Shirt | 3 | size | L |
| 6 | Shirt | 3 | color | red |
| 7 | Shirt | 4 | size | M |
| 8 | Shirt | 4 | color | blue |
-------------------------------------------
我希望结果如下:
-------------------------------------------
| ID | Product | Variant | Option | Content |
-------------------------------------------
| 1 | Shirt | 1 | size | S |
| 2 | Shirt | 1 | color | red |
| 3 | Shirt | 2 | size | M |
| 4 | Shirt | 2 | color | red |
| 5 | Shirt | 3 | size | L |
| 6 | Shirt | 3 | color | red |
-------------------------------------------
当content = M时的结果将是这样的
-------------------------------------------
| ID | Product | Variant | Option | Content |
-------------------------------------------
| 3 | Shirt | 2 | size | M |
| 4 | Shirt | 2 | color | red |
| 7 | Shirt | 4 | size | M |
| 8 | Shirt | 4 | color | blue |
-------------------------------------------
我希望这是有道理的。 谢谢!
我做了一个小提琴 http://sqlfiddle.com/#!9/63e64e/2答案 0 :(得分:1)
SELECT v.id,v.product,v.variant,v.option,v.content
FROM variant v
INNER JOIN (SELECT variant FROM variant WHERE content = 'red')v2
ON v.variant = v2.variant
ORDER BY ID ASC
如果您想获得其他结果,只需将'red'
更改为'M'
。
http://sqlfiddle.com/#!9/63e64e/7
我注意到你的sqlfiddle中有一个M和Yellow的变体,如果你设置了红色'字符串到' M'
答案 1 :(得分:1)
使用自我加入
SELECT v1.*
FROM variant AS v1
JOIN variant AS v2 ON v1.variant = v2.variant
WHERE v2.content = 'red'
这功能相当于Tin Tran的查询,但不需要编写子查询,因此它更简单一些。您需要检查EXPLAIN
输出以确保它们的处理方式相同。
答案 2 :(得分:1)
SELECT *
FROM variant
WHERE
variant.variant
IN
(
SELECT variant.variant
FROM variant
WHERE variant.content = 'red'
)
这应该相对容易理解。您有一个内部查询,首先使用可用选项搜索每个变体。然后,您具有外部查询,用于搜索从变体搜索返回的所有变体的所有值。写一个更优雅的方式可能是,
SELECT *
FROM variant
INNER JOIN
(
SELECT variant2.variant
FROM variant variant2
WHERE variant2.content = 'red'
) variant2
ON variant.variant = variant2.variant
在此示例中,您必须至少命名一个返回的表以区分它们。这是因为您正在调用同一个表的两个实例。
SELECT *
FROM variant
JOIN variant AS variant2 ON variant.variant = variant2.variant
WHERE variant2.content = 'red'
这是输出相同结果的另一个例子。与此问题的不同之处在于您在单个查询中运行它。
可以在此处找到了解联接的好消息来源:https://technet.microsoft.com/en-us/library/ms191472(v=sql.105).aspx
我最喜欢的关于连接的一个图表可以在这里找到:http://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_orig.jpg它缺少一些技巧,但它确实给出了你可以用连接做什么的基本想法。