【问题标题】:mysql use result from select as where clause in UNION querymysql 在 UNION 查询中使用 select 的结果作为 where 子句
【发布时间】:2017-04-29 20:49:15
【问题描述】:

我有桌子 A 里面有这列:

id   name      to_include
1    wanted1   null
2    wanted2   wanted1

如果查询是针对 Wanted2,那么我需要一种方法来使用 WHERE 子句中 to_include 列(在本例中为 wanted1)中的值 我试过这样的:

SELECT * FROM (
    SELECT * FROM A WHERE name = 'wanted2'
) AS B
UNION
SELECT * FROM A WHERE A.name = B.to_include

得到这个错误: “where 子句”中的未知列“B.to_include”

预期结果: 包含示例表中两行的记录集。

【问题讨论】:

  • 您想使用 JOIN 或 IN 或 EXISTS 而不是 UNION
  • 我认为两者都需要 - UNION JOIN。但问题不是很清楚。
  • 发布结果应该是什么样子,很难从你的描述中看出。我怀疑@PaulSpiegel 是对的——您需要在一个查询中使用JOIN,然后将其与UNION 结合起来。
  • 预期结果:示例表中包含两行的记录集。
  • 那么您应该可以接受 Barmars 的回答。我担心,您需要递归地“包含”这些行。

标签: mysql


【解决方案1】:

您不能将 UNION 中的前一个查询作为别名引用。 UNION 中的每个查询都是独立处理的,然后合并结果。

UNION 中的第二个查询必须是 JOIN,并且您需要在执行此操作时重复第一个查询的条件。

SELECT * 
FROM yourTable WHERE name = 'wanted2'

UNION

SELECT b.*
FROM yourTable AS a
JOIN yourTable AS b ON b.name = a.to_include
WHERE a.name = 'wanted2'

DEMO

【讨论】:

  • 根据数据,也可以只使用带有ON b.name IN (a.name, a.to_include)的第二部分
  • @PaulSpiegel 是的,这行得通,但是这段代码更清楚地表达了意图,恕我直言。
  • @PaulSpiegel 我已经测试了您的版本,是的,它也可以工作,但是“取决于数据”是什么意思?
  • @MTK 如果name 不是唯一的,您可能会得到不同的结果(创建重复项)。这是一个例子:sqlfiddle.com/#!9/02820/1
  • @PaulSpigel。谢谢。知道这一点对我有好处。我尝试循序渐进地学习。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
相关资源
最近更新 更多