【问题标题】:issue using mysql with union all将 mysql 与 union all 一起使用的问题
【发布时间】:2015-10-09 18:59:25
【问题描述】:
 select `C1`.`ID` AS `ID`,
`C1`.`Article_ID` AS `Article_ID`,
`C1`.`DateAdded` AS `DateAdded`,
`C1`.`Votes` AS `Votes`,
`C1`.`Content` AS `Content`,
(select 0) AS `isReply`,
`C1`.`Usr_ID` AS `Usr_ID`,
(select NULL) AS `RepliedTo` 
from `Comment` as C1
where isnull(`C1`.`Reply_ID`) limit 5
UNION ALL
select 
`C2`.`Reply_ID` AS `Reply_ID`,
`C2`.`Article_ID` AS `Article_ID`,
`C2`.`DateAdded` AS `DateAdded`,
`C2`.`Votes` AS `Votes`,
`C2`.`Content` AS `Content`,
`C2`.`ID` AS `isReply`,
`C2`.`Usr_ID` AS `Usr_ID`,
`C2`.`RepliedTo` AS `RepliedTo` 
from `Comment` as C2
where (`C2`.`Reply_ID` = `C1`.`Reply_ID` )

我的问题在最后一行 where (C2.Reply_ID = C1.Reply_ID ) 特别是 C2.Reply_ID=C1.Reply_ID

Unknown column C1.Reply_ID in where clause 的错误正在弹出。

我的目标是我想要检索

Table1的所有行

联合所有

在where子句中使用从Table1中检索到的ID的Table2的行

【问题讨论】:

  • 要使用UNION ALL,您应该将参数括在括号中,例如(argument1) UNION ALL (argument 2)
  • @Martin 其实没关系
  • 您在第一个子查询中将Reply_Id 限制为NULL,然后在第二个子查询中对该列使用相等条件。答案很明显:第二个查询不返回任何行。
  • @GordonLinoff 我同意,关于解决方案的任何想法?
  • 再问一个问题。提供样本数据和期望的结果。 SQL Fiddle 总是很有帮助的。您需要提出问题以解决有关reply_id 的问题。我们真的帮不上忙。

标签: mysql


【解决方案1】:

您不能在第二次选择中使用第一次选择中的表格。

您必须在第二个选择查询中重复您的第一个查询

select `C1`.`ID` AS `ID`,
`C1`.`Article_ID` AS `Article_ID`,
`C1`.`DateAdded` AS `DateAdded`,
`C1`.`Votes` AS `Votes`,
`C1`.`Content` AS `Content`,
(select 0) AS `isReply`,
`C1`.`Usr_ID` AS `Usr_ID`,
(select NULL) AS `RepliedTo` 
from `Comment` as C1
where isnull(`C1`.`Reply_ID`) limit 5
UNION ALL
select 
`C2`.`Reply_ID` AS `Reply_ID`,
`C2`.`Article_ID` AS `Article_ID`,
`C2`.`DateAdded` AS `DateAdded`,
`C2`.`Votes` AS `Votes`,
`C2`.`Content` AS `Content`,
`C2`.`ID` AS `isReply`,
`C2`.`Usr_ID` AS `Usr_ID`,
`C2`.`RepliedTo` AS `RepliedTo` 
from `Comment` as C2
where (`C2`.`Reply_ID` in (select `C1`.`ID` 
from `Comment` as C1
where isnull(`C1`.`Reply_ID`) limit 5)

【讨论】:

  • 另外,他正试图在他已经被限制为空的列上使用相等比较。
  • 感谢@Jens 的回答,这样代码的性能如何?
  • 我认为这不是 OP 想要的。不能保证在第一个子查询中返回的五行将在第二个子查询中被选中(即使在其他语法错误被修复之后)。
  • 您可以在 UNION 中多次使用同一个表,只要它不是 TEMPORARY 表...问题查询的问题是第二个查询的 WHERE 引用了第一个查询,即不允许...这可能是您想说的?
【解决方案2】:

这应该给你接近你想要的:

SELECT `ID` AS `ID`
   , `Article_ID` AS `Article_ID`
   , `DateAdded` AS `DateAdded`
   , `Votes` AS `Votes`
   , `Content` AS `Content`
   , IF(copyTbl.copyNum=1, 0, `ID`) AS `isReply`
   , `Usr_ID` AS `Usr_ID`
   , IF(copyTbl.copyNum=1, NULL, `RepliedTo`) AS `RepliedTo` 
FROM `Comment`, (SELECT 1 AS copyNum UNION SELECT 2) AS copyTbl
WHERE `Reply_ID` IS NULL
ORDER BY `ID`, copyTbl.copyNum
LIMIT 10
;

它假定Comment.ID 是唯一的;如果不是这种情况,您需要相应地调整ORDER BY

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 2011-01-24
    • 2018-02-15
    相关资源
    最近更新 更多