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

时间:2016-04-26 00:13:41

标签: mysql select field

我正在尝试构建一个查询,其中我获得了内容与搜索匹配的所有变体。 例如,根据下表,我想获得包含内容的所有变体=" 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

3 个答案:

答案 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它缺少一些技巧,但它确实给出了你可以用连接做什么的基本想法。