2014-08-27 2 views
1

Я использовал ниже запрос, но он показывает ошибку.UNION and ORDER By MySql

SELECT 
    id as number,id,parentid,videoid,subject,name,created,message 
FROM 
    umqlh_hdflv_comments 
WHERE 
    `parentid` = '0' 
    AND `published` = '1' 
    AND `videoid` = '8' 
ORDER BY 
    number DESC, 
    parentid 
UNION ( 
    SELECT 
     parentid as number,id,parentid,videoid,subject,name,created,message 
    FROM 
     umqlh_hdflv_comments 
    WHERE 
     `parentid` != '0' 
     AND `published` = '1' 
     AND `videoid` = '8' 
    ) 

MySQL говорит: Документация

#1221 - Incorrect usage of UNION and ORDER BY 

Как решить эту проблему?

+2

Используйте 'ORDER BY' в самом конце инструкции sql. – Rikesh

+1

Улучшите читабельность вашего SQL, разделив его на несколько строк. Это очень сложно взглянуть. – Raghu

+0

Вы не можете использовать этот порядок с помощью объединения. – Elin

ответ

1

ORDER BY потребности в прикладную в конце полного заявления SQL,

SELECT 
    id as number, 
    id, 
    parentid, 
    videoid, 
    subject, 
    name, 
    created, 
    message 
FROM 
    umqlh_hdflv_comments 
WHERE 
    `parentid` = '0' 
    AND `published` = '1' 
    AND `videoid` = '8' 
UNION ( 
    SELECT 
     parentid as number, 
     id, 
     parentid, 
     videoid, 
     subject, 
     name, 
     created, 
     message 
    FROM 
     umqlh_hdflv_comments 
    WHERE 
     `parentid` != '0' 
     AND `published` = '1' 
     AND `videoid` = '8' 
    ) 
    ORDER BY number DESC,parentid 

Reference.

0

Синтаксически вам необходимо переместить заказ до конца запроса. Кроме оптимизаций, таких как «лимит», нет смысла заказывать одну из частей в объединении, так как результат не гарантируется, что он будет отсортирован так или иначе.

SELECT id as number 
     ,id 
     ,parentid 
     ,videoid 
     ,subject 
     ,name 
     ,created,message 
FROM umqlh_hdflv_comments 
WHERE `parentid` = '0' 
    AND `published` = '1' 
    AND `videoid` = '8' 
UNION 
SELECT parentid as number 
    ,id 
    ,parentid 
    ,videoid 
    ,subject 
    ,name 
    ,created,message 
FROM umqlh_hdflv_comments 
WHERE `parentid` != '0' 
AND `published` = '1' 
AND `videoid` = '8' 
ORDER BY number DESC,parentid 

Однако этот запрос также может быть выражено как:

SELECT case when parentid = 0 then id else parentid end as number 
     ,id 
     ,parentid 
     ,videoid 
     ,subject 
     ,name 
     ,created,message 
FROM umqlh_hdflv_comments 
WHERE `published` = '1' 
    AND `videoid` = '8' 
ORDER BY number DESC,parentid 

Если ParentId может быть пустым вам нужно добавить ParentID не равно нулю в выражении WHERE. Кроме того, если строки не уникальны (я предположил это, так как столбец с именем id), вам нужно добавить разницу для того, чтобы запрос был эквивалентным.