2014-08-27 4 views
1

J'ai utilisé la requête ci-dessous, mais il montre une erreur.UNION et ORDER Par 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 dit: Documentation

#1221 - Incorrect usage of UNION and ORDER BY 

Comment puis-je résoudre ce problème?

+2

Utilisez 'ORDER BY' à la fin de l'instruction sql. – Rikesh

+1

Veuillez améliorer la lisibilité de votre SQL en le divisant en plusieurs lignes. C'est vraiment difficile de jeter un coup d'oeil. – Raghu

+0

Vous ne pouvez pas utiliser la commande de cette manière avec une union. – Elin

Répondre

1

ORDER BY besoins à appliquer à la fin de l'instruction SQL complète,

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

Syntaxiquement, vous devez déplacer l'ordre jusqu'à la fin de la requête. A part pour les optimisations telles que «limiter», il n'est pas logique de commander une des parties d'une union, car le résultat n'est pas garanti pour être trié de toute façon.

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 

Cependant, cette requête pourrait aussi être exprimée comme:

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 

Si parentid peut être nul, vous devez ajouter parentid est non nulle à la clause where. De plus, si les lignes ne sont pas uniques (j'ai supposé cela puisque la colonne s'appelle id), vous devez ajouter distinct pour que la requête soit équivalente.