MySQL 在链接字段匹配时选择行

MySQL selecting rows when a linked field matches

我正在尝试构建一个查询,从中获取内容与搜索相匹配的所有变体。 例如,基于下面的 table 我想获取包含内容 = "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    |
 -------------------------------------------

我希望这是有道理的。 谢谢!

我做了一个fiddle http://sqlfiddle.com/#!9/63e64e/2

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 的变体,如果你将 'red' 字符串设置为 'M'

,它会出现在结果中

使用自连接

SELECT v1.*
FROM variant AS v1
JOIN variant AS v2 ON v1.variant = v2.variant
WHERE v2.content = 'red'

这在功能上等同于 Tin Tran 的查询,但不需要编写子查询,因此更简单一些。您需要检查 EXPLAIN 输出以确保它们的处理方式相同。

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

在此示例中,您必须至少命名一个返回的 table 以区分它们。这是因为您正在调用相同 table.

的两个实例
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它缺少一些技巧,但它确实给出了一个很好的基本概念,说明您可以用联接做什么。