[RESOLU] [MySQL] Gérer une exception dans le tri d'une requête

Gérer une exception dans le tri d'une requête [RESOLU] [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 04-01-2008 à 12:48:51    

Bonjour à tous,
 
Je cherche sans succès à faire une exception sur le tri d'une requête sur une base MySQL... Je m'explique :
 
J'ai écrit cette requête qui fonctionne très bien :
SELECT id_p_article,date,titre,image,image_position FROM p_article WHERE online = 1 ORDER BY date DESC, id_p_article DESC
 
Mais j'aimerai compléter mon ORDER BY pour que l'article dont le id_p_article = 1 soit toujours affiché en premier. Et ensuite, les résultats doivent être classés comme je l'ai indiqué.
 
Comment modifier ma requête pour gérer l'exception du premier article ?
 
Merci d'avance  ;)  
 
Arnaud.


Message édité par Arnaud1106 le 07-01-2008 à 12:14:06
Reply

Marsh Posté le 04-01-2008 à 12:48:51   

Reply

Marsh Posté le 04-01-2008 à 20:33:01    

SELECT ... FROM ... WHERE ... ORDER BY .... (spécifique au premier article)
UNION
SELECT ... FROM ... WHERE ... ORDER BY .... (général)

Reply

Marsh Posté le 05-01-2008 à 00:11:36    

Y a de l'idée. Encore que apparemment vu le nom de ton champ il s'agit de ta primary key, donc tu le filtres directement dans le where du premier select et tu n'as plus de ORDER puisque c'est le seul enregistrement qui remonte pour cette requête.


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 06-01-2008 à 18:16:33    

Merci à vous deux. A priori c'est effectivement ce que je cherche... j'ignorais l'existence de UNION !  :sarcastic:  
 
Il me reste un petit souci au niveau de l'ordre des résultats retournés. Sur vos conseils j'ai donc écrit la requête suivante :
 
(SELECT id_p_article,date,titre,image,image_position FROM p_article WHERE id_p_article = 1)
UNION
(SELECT id_p_article,date,titre,image,image_position FROM p_article WHERE online = 1 AND id_p_article != 1 ORDER BY date DESC, id_p_article DESC)
 
... et le ORDER BY présent dans le deuxième SELECT semble être ignoré.
 
Je ne m'y prend pas comme il faut ?
 
Merci encore,
 
Arnaud.

Reply

Marsh Posté le 07-01-2008 à 09:25:43    

le union c'était pas une bonne idée (et en plus ça doit pourrir les perfs ):o

Code :
  1. SELECT
  2. id_p_article,date,titre,image,image_position
  3. FROM
  4. p_article
  5. WHERE online = 1
  6. ORDER BY case ip_p_article when 1 then 1 else 0 end ASC, date DESC, id_p_article DESC
 

Par contre, je comprends pas une chose, quelles sont les valeurs possibles de id_p_article?


Message édité par anapajari le 07-01-2008 à 09:26:06
Reply

Marsh Posté le 07-01-2008 à 09:39:57    

Je vais essayer ça en début d'après-midi... merci !
 
Pour répondre à ta question, id_p_article est la clé primaire de ma table.

Reply

Marsh Posté le 07-01-2008 à 10:12:17    

oui mais alors je comprends pas du tout ce que tu cherches à faire...
 
Pourquoi est-ce que le premier élément de ta table (id_p_article=1) doit apparaître avant les autres ( qui sont eux triés par ordre décroissant)?
La logique m'échappe complètement!

Reply

Marsh Posté le 07-01-2008 à 11:34:03    

Et bien en fait je dois modifier une page qui affiche des articles. A la base, tous les articles, par ordre décroissant de date, puis d'id (au cas où il y aurait plusieurs articles pour une même date).
 
Ce fonctionnement doit rester intact SAUF QUE... on me demande de mettre un certains article (celui dont l'id est 1 en l'occurence) toujours en premier.
 
Voilà voilà.

Reply

Marsh Posté le 07-01-2008 à 11:46:52    

oui bin tu fais deux requêtes dans ce cas là:

  • une pour gérer l'exception ( ou les si un jour ça arrive)
  • une pour gérer les cas normaux

Reply

Marsh Posté le 07-01-2008 à 12:13:35    

Deux requêtes, effectivement c'est ce que je voulais faire depuis le début, mais je pensais trouver plus simple.
 
J'ai donc mis ce système en place et tout fonctionne nickel.
 
Merci à ceux qui m'ont répondu !  :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed