在子查询中的union all只返回1ste值 - 我想

时间:2017-04-16 11:29:07

标签: mysql sql

当自己在下面运行时,我得到3或任何记录,这取决于正确的结构(2个查询返回父ID和该父项的所有子项 - 到目前为止一直很好):

SELECT @channelid:=channelid AS channelid FROM channel WHERE channelid=7
UNION ALL
SELECT @channelid:=channelid AS channelid FROM channel 
JOIN (SELECT @channelid:=7) tmp WHERE channelid_parent=@channelid

不,我不想要那些channelid的广告 - 但是使用它作为子查询只返回1条记录(似乎)

SELECT marketadheading FROM marketad WHERE channelid IN (
SELECT @channelid:=channelid AS channelid FROM channel WHERE channelid=7
UNION ALL
SELECT @channelid:=channelid AS channelid FROM channel 
JOIN (SELECT @channelid:=7) tmp WHERE channelid_parent=@channelid ) 
我是愚蠢还是什么?

更新

SELECT @channelid:=channelid AS channelid FROM channel 
JOIN (SELECT @channelid:=7) tmp WHERE channelid_parent=@channelid

返回值为11的1条记录 - 并且有一条带有channelid 11的加法

但正在运行

SELECT marketadheading FROM marketad WHERE channelid IN (
SELECT @channelid:=channelid AS channelid FROM channel 
JOIN (SELECT @channelid:=7) tmp WHERE channelid_parent=@channelid) 

没有返回任何广告,因此似乎IN未使用SELECTS值或嵌套选择不返回值

1 个答案:

答案 0 :(得分:0)

评论太长了。

您正在使用变量来导航层次结构。问题是MySQL不保证SELECT语句的不同部分中带有变量的表达式的求值顺序。

但是,您的逻辑依赖于与WHERE一起评估的SELECT语句 - 并且(我也应该提及) - 关于正在评估的channel中行的特定顺序。

换句话说,如果这种方法有效,那么你就是“幸运的”。没有保证。

不幸的是,MySQL没有简单的解决方案;它根本没有对图结构的真正支持(其他数据库提供递归CTE)。您可以在MySQL中研究分层数据模型。有一些方法可以处理这种层次结构。这种类型的查询不是一个可靠的解决方案。