2009-07-03 7 views
9

J'ai une table MySQL avec les données suivantes (simplifié):Tri certaines valeurs au sommet

INSERT INTO `stores` (`storeId`, `name`, `country`) VALUES 
(1, 'Foo', 'us'), 
(2, 'Bar', 'jp'), 
(3, 'Baz', 'us'), 
(4, 'Foo2', 'se'), 
(5, 'Baz2', 'jp'), 
(6, 'Bar3', 'jp'); 

Maintenant, je veux être en mesure d'obtenir une liste paginée des magasins qui commence par le pays des clients.

Par exemple, un client américain verrait la liste suivante:

Foo 
Baz 
Bar 
Foo2 
Baz2 
Bar3 

La solution naïve que je utilise en ce moment (exemple avec un client américain et Taille de la page 3):

(SELECT * FROM stores WHERE country = "us") UNION (SELECT * FROM stores WHERE country != "us") LIMIT 0,3 

Y a-t-il de meilleures façons de faire cela? Est-ce que ORDER BY peut être utilisé et dit de mettre une certaine valeur en haut?

Répondre

15

Essayez ceci:

SELECT * FROM stores ORDER BY country = "us" DESC, storeId 
+0

Ahh, c'est exactement ce que je cherchais, merci – truppo

1

Vous devez lier chaque valeur d'un pays avec un numérique, un cas:

select * 
from stores 
order by case when country = "us" then 1 
       else 0 
     end desc 
1

Créer une table des codes de pays et les commandes, joignez-vous à elle dans votre requête, puis pour le pays l'ordre du code.

Donc, vous avez une table qui ressemble à

CountryOrder 

Code Ord 
---- --- 
us 1 
jp 2 
se 3 

puis le code qui ressemble à:

SELECT s.* 
FROM Stores s 
INNER JOIN CountryOrder c 
    ON c.Code = s.Country 
ORDER BY c.Ord; 
1

Comment l'utilisation IF pour affecter la valeur supérieure aux lignes des États-Unis. Cela vous donnera une pseudo colonne appelée sort_country_cd. Ici vous pouvez mapper "US" à "aaaUS". JP peut encore être mappé à JP.

Cela place les États-Unis en tête de votre liste de tri.

+0

SELECT country_code, country_name DE pays ORDER BY SI (country_code IN ('CA' , 'US'), 0,1), country_name –

4

Pour obtenir le pays pour effectuer des recherches d'abord, et le reste par ordre alphabétique:

SELECT * 
FROM stores 
ORDER BY country = 'us' DESC, country ASC 
Questions connexes