2010-12-28 3 views
0

Ville de deux colonnes et priorité.Mysql, complexe ORDER BY

J'ai besoin de trier la table, de sorte que les villes ayant la priorité = 1 soient en premier et non triées par nom ASC, tandis que les autres sont triées par nom ASC.

Comment est-ce que je ferais cela?

Merci;)

Mise à jour

SELECT * 
FROM map_towns 
ORDER BY priority DESC, town 

Comme cela, mais pour que la priorité étaient de 1 à 12+ au lieu de 12 à 1.

Comme ça:

town priority 
b_town1 1 
a_town2 2 
d_town3 3 
c_town4 4 
a_town5 NULL 
b_town6 NULL 
c_town7 NULL 
d_town8 NULL 

etc ...

+0

Pourquoi ne pas ajouter la structure de votre table et un échantillon du résultat que vous voulez ... Je suis sûr que je comprends nit votre question complètement. – Jaime

+0

COMMANDER PAR priorité, ville ????? –

+0

J'ai relu la question une deuxième fois après avoir posté ma réponse. Ne vous souciez-vous que de la priorité = 1? ou devrait prioritaire = 1 être trié avant la priorité = 2 et ainsi de suite? Par exemple, si "a_town2" obtient la priorité = 4 et "c_town4" la priorité = 2, qui vient en premier? – Ronnis

Répondre

1

By default, MySQL sorts nulls first

J'ai créé un petit boîtier de test (lignes insérées non -sorted sur pu rpose).

create table map_towns(
    town varchar(30) not null 
    ,priority int null 
); 

insert into map_towns(town, priority) values('d_town3', 3); 
insert into map_towns(town, priority) values('a_town2', 2); 
insert into map_towns(town, priority) values('c_town4', 4); 
insert into map_towns(town, priority) values('b_town1', 1); 
insert into map_towns(town, priority) values('b_town6', NULL); 
insert into map_towns(town, priority) values('d_town8', NULL); 
insert into map_towns(town, priority) values('a_town5', NULL); 
insert into map_towns(town, priority) values('c_town7', NULL); 

La requête suivante doit faire ce que vous demandez.

select town 
     ,priority 
     ,isnull(priority) 
from map_towns 
order by isnull(priority), priority, town; 

+---------+----------+------------------+ 
| town | priority | isnull(priority) | 
+---------+----------+------------------+ 
| b_town1 |  1 |    0 | 
| a_town2 |  2 |    0 | 
| d_town3 |  3 |    0 | 
| c_town4 |  4 |    0 | 
| a_town5 |  NULL |    1 | 
| b_town6 |  NULL |    1 | 
| c_town7 |  NULL |    1 | 
| d_town8 |  NULL |    1 | 
+---------+----------+------------------+ 

Voici un lien sur ISNULL documentation

+0

Putain oui! Juste ce que je voulais. Comment ai-je pu oublier l'instruction ISNULL ... Donc, fondamentalement, nous parcourons le résultat pour générer des drapeaux et ensuite trier par eux. Merci mon pote ;) – Somebody

0

Mon idée:

SELECT * FROM Towns 
ORDER BY IF(priority = 1, 0, 1) ASC, 
     town ASC; 
0

bien faire tout simplement pour que la priorité par défaut est 0, puis chaque ville que vous avez, vous pouvez les trier en fonction d'un certain nombre. Je ferais normalement quelque chose comme DisplayOrder qui en termes pourrait être votre priorité.

quelque chose comme ça.

SELECT * FROM Towns 
ORDER BY priority ASC, 
name ASC; 

Donc, si vous avez quelque chose comme

id, name, priority 
----------------------- 
1, Smithtown, 0 
2, Rocktown, 2 
3, Georgetown, 1 
4, Rockton, 2 

La commande serait alors

1, Smithtown, 0 
3, Georgetown, 1 
4, Rockton, 2 
2, Rocktown, 2 
0
SELECT * 
FROM map_towns 
ORDER BY 
     priority IS NULL, priority, town 
+0

Oui, mais la liste triée "priorité <> 1" se trouve à la fin de la liste, mais doit être la première de la liste. Merci tu mate;) – Somebody

+0

@Beck: 'priorité <> 1' évaluera à '1' pour les villes avec' priority' pas égal à celui qui les placera après ceux avec 'priority = 1'. N'est-ce pas ce que tu voulais? – Quassnoi

+0

Il ne les place pas après, c'est le problème. Tout le reste fonctionne bien. J'ai besoin de la priorité> 1 être le premier dans la liste. – Somebody