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它缺少一些技巧,但它确实给出了一个很好的基本概念,说明您可以用联接做什么。
我正在尝试构建一个查询,从中获取内容与搜索相匹配的所有变体。 例如,基于下面的 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它缺少一些技巧,但它确实给出了一个很好的基本概念,说明您可以用联接做什么。