Gestion des ORDER BY avec les UNION

Eléphanteau du PHP | 47 Messages

19 mars 2008, 01:15

Bonjour,

Je souhaite faire une union de deux résultats, seulement les deux sous-requêtes contiennent des OREDER BY ce qui n'est pas possible ! Comment faire ? Une idée lumineuse ?

Code : Tout sélectionner

SELECT s2.sujet_id, s2.sujet_nom FROM fsb_messages m2 JOIN fsb_sujets s2 USING ( sujet_id ) WHERE s2.sujet_nom LIKE '%prog%' AND s2.sujet_nom LIKE '%[Réglé]%' GROUP BY s2.sujet_id ORDER BY COUNT( s2.sujet_id ) DESC UNION SELECT s2.sujet_id, s2.sujet_nom FROM fsb_messages m2 JOIN fsb_sujets s2 USING ( sujet_id ) WHERE s2.sujet_nom LIKE '%prog%' GROUP BY s2.sujet_id ORDER BY COUNT( s2.sujet_id ) DESC -- -- Structure de la table 'fsb_messages' -- CREATE TABLE fsb_messages ( message_id int(11) NOT NULL auto_increment, forum_id mediumint(9) NOT NULL default '0', sujet_id int(11) NOT NULL default '0', membre_id int(11) NOT NULL default '0', pseudo_posteur varchar(30) collate latin1_general_ci NOT NULL default '', message_texte text collate latin1_general_ci NOT NULL, message_temps int(20) NOT NULL default '0', message_ip varchar(20) collate latin1_general_ci NOT NULL default '', PRIMARY KEY (message_id), KEY message_id (message_id), KEY sujet_id (sujet_id) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci; -- -------------------------------------------------------- -- -- Structure de la table 'fsb_sujets' -- CREATE TABLE fsb_sujets ( sujet_id int(11) NOT NULL auto_increment, forum_id int(11) NOT NULL default '0', membre_id int(11) NOT NULL default '0', sujet_nom varchar(250) collate latin1_general_ci NOT NULL default '', nb_vu int(11) NOT NULL default '0', nb_reponse int(11) NOT NULL default '0', dernier_message_id int(11) NOT NULL default '0', dernier_message_temps int(11) NOT NULL default '0', premier_message_id int(11) NOT NULL default '0', sujet_type smallint(6) NOT NULL default '0', sujet_status tinyint(4) NOT NULL default '1', PRIMARY KEY (sujet_id), UNIQUE KEY sujet_id (sujet_id) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
PS: Dans notre cas, je veux que les sujets réglés soient en premiers retournés, le nombre de fois que le mot a été trouvé dans le sujet est secondaire...
SGBD: MySQL

Eléphanteau du PHP | 28 Messages

19 mars 2008, 22:09

Bonjour,

Je n'ai pas regardé en détail tes requêtes, mais peut être que les requêtes imbriquées sont une bonne piste ?

En faisant quelque chose comme ça :

SELECT * FROM (
SELECT s2.sujet_id, s2.sujet_nom
FROM fsb_messages m2
JOIN fsb_sujets s2
USING ( sujet_id )
WHERE s2.sujet_nom LIKE '%prog%'
AND s2.sujet_nom LIKE '%[Réglé]%'
GROUP BY s2.sujet_id
ORDER BY COUNT( s2.sujet_id ) DESC
UNION SELECT s2.sujet_id, s2.sujet_nom
FROM fsb_messages m2
JOIN fsb_sujets s2
USING ( sujet_id )
WHERE s2.sujet_nom LIKE '%prog%'
GROUP BY s2.sujet_id
ORDER BY COUNT( s2.sujet_id ) DESC
) ORDER BY ****

Bonne soiré !

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

21 mars 2008, 20:54

Comme indiqué dans le manuel, il faut placer les ORDER BY à l'intérieur des parenthèses de chaque SELECT.

Voir http://dev.mysql.com/doc/refman/5.0/fr/union.html

Eléphanteau du PHP | 47 Messages

23 mars 2008, 01:09

En effet le problème venait des parenthèses...
Mille mercis...

@+