【问题标题】:Use value from first select for second select in union?将第一个选择的值用于联合中的第二个选择?
【发布时间】:2014-12-05 22:19:57
【问题描述】:

假设我有下表,这是一个熟悉的示例。

+----------------------------------+
|              TAGS                |
+--------+-------------+-----------+
| tag_id |   tag_name  | parent_id |
+--------+-------------+-----------+
|   1    | programming |    NULL   |
|   2    |     php     |      1    |
|   3    |    class    |      2    |
|   4    |    object   |      2    |
|   5    |    method   |      3    |
+--------+-------------+-----------+

我正在尝试设计一个查询,该查询根据初始选择语句的值选择关联的parent_idtag_name

类似这样的:

SELECT * FROM tags AS child
WHERE child.tag_name = 'object'
UNION
SELECT * FROM tags AS parent
WHERE parent.parent_id = child.parent_id

我需要能够从这两个查询中返回组合的行,这就是我使用UNION 的原因。

预期结果应该是:

+--------+-------------+-----------+
| tag_id |   tag_name  | parent_id |
+--------+-------------+-----------+
|   2    |     php     |      1    |
|   4    |    object   |      2    |
+--------+-------------+-----------+

我也认为JOIN 可能会起作用,但我不能让它起作用。

【问题讨论】:

  • 这称为分层查询。这可能是答案:*.com/questions/8104187/mysql-hierarchical-queries。不过,请务必阅读评论中的警告。这可能很危险。
  • 我不明白您是如何获得预期结果的?您想要标签名称为“object”的所有行(即第 4 行)并且想要获取具有相同 parent_id 的行?那么为什么不只返回对象和类呢?
  • 由于我最初在第一次选择中选择对象,因此我需要选择父项 (php) 作为第一次查询的结果。我知道示例查询是错误的,所以我正在寻找有关如何更正它的指导。

标签: mysql sql select join union


【解决方案1】:

试试这个:

SELECT tag_id, tag_name, parent_id  
FROM tags AS child
WHERE child.tag_name = 'object'
UNION
SELECT parent.tag_id, parent.tag_name, parent.parent_id  
FROM tags AS parent
INNER JOIN tags AS child ON parent.tag_id = child.parent_id AND child.tag_name = 'object';

查看SQL FIDDLE DEMO

输出

| TAG_ID | TAG_NAME | PARENT_ID |
|--------|----------|-----------|
|      4 |   object |         2 |
|      2 |      php |         1 |

【讨论】:

  • 该查询没有结果。
【解决方案2】:

试试这个:

SELECT *
FROM tags t1, tags t2
WHERE t1.parent_id = t2.parent_id AND t1.tag_name = 'object';

【讨论】:

  • 只选择同一行两次。
【解决方案3】:

如果您希望 tag_name = 'object' 返回 'php',则需要将 child.parent_id 等同于 parent.tag_id(而不是 parent_id 彼此等同)

...
WHERE parent.parent_id = child.parent_id

【讨论】:

  • 我作为示例使用的查询的问题是,第二个选择无法识别第一个选择的子别名。
最近更新 更多