2009-10-13 8 views
1

J'ai une table pour deux types de nouvelles. Je veux créer une liste d'entre eux commandés par une date qui dépend du type de nouvelles, alors j'ai essayé ceci:Mélange le tri ascendant et descendant dans le tri conditionnel dans MySQL

SELECT * FROM my_table 
ORDER BY case type 
       when 'news' then creation_date 
       else 'events' then starting_date 
     end desc;

Ce que je veux est de trier nouvelles par creation_date ASC et événements par starting_date DESC. J'ai essayé d'ajouter simplement

when 'news' then creation_date ASC 
else 'events' then starting_date DESC

mais cela ne fonctionne pas. Est-il possible de faire cela?

Merci.

+0

Cela n'a pas de sens pour moi, pouvez-vous ajouter un exemple, comment voulez-vous que le résultat à trier? –

+0

Les nouvelles sont toujours dans le passé et les événements dans le futur. Nous voulons afficher les nouvelles et les événements les plus proches. En utilisant le premier SELECT, j'ai obtenu les événements les plus éloignés, puis les nouvelles et les événements mélangés à la bonne date. Mais je dois d'abord afficher l'événement le plus proche d'aujourd'hui. Ensuite, les nouvelles doivent être triées par date de création DESC (ups, je l'ai dit dans l'autre sens), celles avec des dates plus importantes devraient apparaître en premier, alors que les événements sont inversés, les plus petites dates apparaissent en premier. Est-ce plus clair de cette façon? J'ai vraiment eu du mal à comprendre ce que mon patron veut. –

Répondre

2

Je pense que vous devez faire deux requêtes distinctes, chacune triée à sa guise. Pour trier, il doit pouvoir comparer n'importe quel élément à n'importe quel autre élément, et décider lequel vient en premier. Il n'a aucun moyen de comparer un élément «actualités» à un élément «événement» et d'obtenir un résultat significatif.

+0

+1 Il existe une multitude de tris "valides" dans lesquels la date de création des actualités est ascendante et les événements descendent, en fonction de leur entrelacement. Vous devrez préciser cela plus clairement, sinon la solution la plus évidente serait de le trier et de l'unir avec l'autre. –

1

J'ai trouvé la solution:

SELECT 
    UNIX_TIMESTAMP(creation_date) AS order_column, 
    creation_date, 
    type, 
    other_columns 
FROM my_table 
WHERE type='news' 
UNION ALL 
SELECT 
    -UNIX_TIMESTAMP(starting_date) AS order_column, 
    starting_date, 
    type, 
    other_columns 
FROM my_table 
WHERE type='events' 
ORDER BY order_column 

Important est le moins avant la deuxième fonction UNIX_TIMESTAMP. Il en résultera des événements triés en ordre décroissant puis toutes les nouvelles triées en ordre croissant. J'espère que c'est ce que tu voulais.

0

quelque chose comme ça va-t-il fonctionner?

select m.*, 
     case type 
      when 'news' then 
      creation_date 
      when 'events' then 
      starting_date 
     end as sort_date 
from my_table m 
order by sort_date desc 
+0

Il va trier les deux descendant, alors qu'il devrait être un croissant et un décroissant. –

0
select m.*, 
     case type 
      when 'news' then 
      creation_date 
     end as sort_date_1, 
     case type 
      when 'events' then 
      starting_date 
     end as sort_date_2 
from my_table m 
order by type desc, sort_date_1 asc nulls last, sort_date_2 desc nulls last