tri selon une séquence définie

Invité
Invité n'ayant pas de compte PHPfrance

24 juil. 2012, 22:58

Bonsoir,

Je souhaiterais faire un tri alphabétique à partir de la 2ème ligne d'une table. Le première ligne de la table (record 1) doit cependant toujours être bien visible en 1ère ligne.

Sans succès, j'ai d'abord tenté avec UNION :
(SELECT * from `rub_1` WHERE `id_p1`=1 )
UNION
(SELECT * FROM `rub_1` WHERE `id_p1`!=1 ORDER BY `r_1` ASC)

Faut-il nécessairement passer par 2 requêtes bien séparées pour obtenir des données triées selon l'ordre particulier (1ère ligne, puis toutes les autres lignes sont triées par ordre alphabétique) ?

Merci de votre avis.

Eléphant du PHP | 53 Messages

25 juil. 2012, 10:41

Bonjour,

Si j'ai bien compris tu veut afficher la première ligne sans tri et la seconde triée ?
(Tu n'aurais pas oublié le "FROM" dans tes requêtes ?)
SELECT Ligne1, Ligne2
FROM TaTable
ORDER BY Ligne2 ASC
;
Cordialement.
Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison.

Eléphant du PHP | 57 Messages

25 juil. 2012, 12:24

Bonjour,

Un petit exemple pour être plus explicite :

id tit
----------------------
0 rouge
1 violet
2 orange
3 jaune
4 bleu


L'idée, c'est qu'après une seule requête, on retrouve les résultats selon le tri ci-dessous (ordre alphabétique dès 2ème ligne)

id tit
----------
0 rouge
4 bleu
3 jaune
2 orange
1 violet

Merci.

Eléphant du PHP | 53 Messages

25 juil. 2012, 14:33

Rebonjour,

EDIT : Mal compris la question donc réponse hors de propos.

Cordialement.
Modifié en dernier par DiurnaSys le 25 juil. 2012, 14:35, modifié 1 fois.
Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 juil. 2012, 14:34

salut,

as tu essayé de jouer avec la clause having ? (et pourquoi pas le rownum si tu utilise oracle).


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 57 Messages

25 juil. 2012, 17:16

Bonjour,

J'utilise Mysql. Que pourrais-je faire avec la clause having dans ce cas-là ?

En l'état, je vois que 2 requêtes et retravailler mon tableau avec php...

Merci.

Eléphant du PHP | 57 Messages

09 août 2012, 12:22

Bonjour,

Finalement, j'ai passé par 2 requêtes séparées pour obtenir des données triées selon l'ordre particulier (1ère ligne imposée, puis toutes les autres lignes sont triées par ordre alphabétique).

En effet, avec un requête de type UNION, l'ordre n'est pas adéquat.

(SELECT * from `rub_1` WHERE `id_p1`=1 )
UNION
(SELECT * FROM `rub_1` WHERE `id_p1`!=1 ORDER BY `r_1` ASC)


=========================
id---------------------- tit
=========================
0---------------------- rouge
1---------------------- violet
2---------------------- orange
3 ----------------------jaune
4 ----------------------bleu


L'idée, c'est qu'après une seule requête, on retrouve les résultats selon le tri ci-dessous (ordre alphabétique dès 2ème ligne)
=========================
id---------------------- tit
=========================
0---------------------- rouge
4 ----------------------bleu
3 ----------------------jaune
2 ----------------------orange
1 ----------------------violet

Eléphant du PHP | 190 Messages

09 août 2012, 12:46

Salut,

je ne comprend pas bien ce que tu veux dire par 2ème ligne. Mais il y'a le ORDER BY FIELD qui existe.
SELECT * from rub_1 ORDER BY FIELD(tit,'rouge','bleu','jaune','orange','violet')
;)

edit: ok j'ai compris... Donc
SELECT * from rub_1 ORDER BY FIELD(tit,'rouge') DESC, tit ASC
Edit: manquait le DESC
Modifié en dernier par Zahnzao le 09 août 2012, 13:32, modifié 2 fois.

ViPHP
xTG
ViPHP | 7331 Messages

09 août 2012, 12:49

Comme le disait moogli pourquoi n'essaies-tu pas avec having pour appliquer ta clause ORDER sous condition ?
SELECT * FROM `rub_1` HAVING `id_p1`!=1 ORDER BY `r_1` ASC
Concernant le n-uplet d'id 1 il me semble qu'avec une telle requête il sortira en premier s'il est le premier enregistré dans la table et sinon à la fin s'il est au sein des autres n-uplet ou en fin.

ViPHP
ViPHP | 2577 Messages

09 août 2012, 14:09

Peut être :
SELECT * FROM rub_1 ORDER BY IF(id_p1=1, 0,1), r_1

Eléphant du PHP | 57 Messages

09 août 2012, 14:18

Merci à Zahnzao et xTG pour votre aide.

La solution de Zahnzao me semble parfaite

SELECT `r_id`, `r_0` as `r` FROM `r_1` ORDER BY FIELD(`r_id`,'0') DESC, `r` ASC.

=D>

Eléphant du PHP | 190 Messages

09 août 2012, 14:29

A noter que j'avais oublier le DESC au départ, j'ai édité pour l'ajouter.

En effet lorsque tout les champs possibles sont renseignés dans le FIELD(table,'field1','field2','field3'), il sont trié correctement.

Par contre s'il reste des champs qui ne sont pas dans le FIELD, ils passent avant... Etrange comme comportement. C'est pour cela que j'ai rajouté le DESC après avoir testé.

Par exemple si tu avais 2 champs imposés avant ton triage alpha, cette méthode n'aurait pas fonctionné. Faisant passer le champ 2 avant le champ 1 à cause du DESC.

http://www.electrictoolbox.com/mysql-or ... ld-values/

Bref, ca fonctionne, tant mieux ;)

Eléphant du PHP | 57 Messages

09 août 2012, 14:52

Super. Encore merci.