2015-10-09 3 views
0
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вопрос, используя MySQL с союза все

об ошибке с Unknown column C1.Reply_ID in where clause является выскакивают.

Моя цель состоит в том, что я хочу, чтобы получить

Все строки Table1

Союз Все

Ряды Table2 с использованием идентификаторов извлечена из Table1 в котором пункт

+0

Чтобы использовать 'UNION ALL', вы должны обернуть аргументы в скобках, такие как' (argument1) UNION ALL (аргумент 2) ' – Martin

+0

@Martin его не имеет значения на самом деле –

+1

Вы ограничиваете' Reply_Id' 'NULL' в первом подзапросе и затем использовать условие равенства для этого столбца во втором. Ответ очевиден: второй запрос не возвращает строк. –

ответ

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) 
+0

также он пытается использовать сравнение равенства в столбце, к которому он уже привязан к нулю. –

+0

Спасибо за ответ @Jens, как насчет производительности такого кода? –

+1

Я не думаю, что это делает то, что хочет OP. Нет гарантии, что пять строк, возвращенных в первом подзапросе, будут выбраны во втором (даже после исправления других синтаксических ошибок). –

1

Это должно дать вам близко к тому, что вы хотите:

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.

Смежные вопросы