2009-07-03 6 views
9

ich eine MySQL-Tabelle mit den folgenden Daten (vereinfacht):Sortierung bestimmte Werte an die Spitze

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'); 

Nun, ich möchte eine paginierte Liste der Geschäfte erhalten können, die mit dem Kunden Land beginnt.

Zum Beispiel ein amerikanischer Kunde würde siehe die folgende Liste:

Foo 
Baz 
Bar 
Foo2 
Baz2 
Bar3 

Die naive Lösung, die ich jetzt bin mit (Beispiel mit einer amerikanischen Kunden und Seitengröße 3):

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

Gibt es bessere Möglichkeiten, dies zu tun? Kann ORDER BY benutzt werden und gesagt werden, dass ein bestimmter Wert an der Spitze steht?

Antwort

15

Try this:

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

Ahh, genau das habe ich gesucht, danke – truppo

1

Sie haben jeden Wert eines Landes mit einem numerischen zu verbinden, mit einem Fall:

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

Erstellen Sie eine Tabelle für die Ländercodes und Befehle, verbinden sie durch das Land, um es in Ihrer Abfrage, und dann bestellen Code-Reihenfolge.

So würden Sie eine Tabelle, die wie

CountryOrder 

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

und dann Code sieht das wie folgt aussieht:

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

Wie wäre es mit IF zuweisen den oberen Wert auf US Reihen.

select if(country_cd='us,'aaaUS',country_cd) sort_country_cd, country_cd from stores Order by sort_country_cd 

Dadurch erhalten Sie eine Pseudospalte namens sort_country_cd. Hier können Sie "US" zu "aaaUS" zuordnen. JP kann immer noch auf JP abgebildet werden.

Damit steht US ganz oben auf Ihrer Sortierliste.

+0

SELECT country_code, country_name von Land ORDER BY IF (country_code IN ('CA' , 'US'), 0,1), country_name –

4

Um das gesuchte für ein Land zu bekommen, und der Rest in alphabetischer Reihenfolge:

SELECT * 
FROM stores 
ORDER BY country = 'us' DESC, country ASC 
Verwandte Themen