2009-07-03 8 views
9
superior

Tengo una tabla MySQL con los siguientes datos (simplificado):Ordenación de ciertos valores a la

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

Ahora, quiero ser capaz de obtener una lista paginada de tiendas que comienza con el país clientes.

Por ejemplo, un cliente americano vería la siguiente lista:

Foo 
Baz 
Bar 
Foo2 
Baz2 
Bar3 

La solución ingenua que estoy usando en este momento (ejemplo con un cliente y la página de tamaño americano 3):

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

¿Hay alguna forma mejor de hacer esto? ¿Se podría usar ORDER BY y se le podría indicar que coloque un cierto valor en la parte superior?

Respuesta

15

Prueba esto:

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

Ahh, esto es exactamente lo que estaba buscando, gracias – truppo

1

Hay que vincular cada valor de un país con un valor numérico, con un caso:

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

Crear una tabla de códigos y órdenes de campo, unirse a ella en su consulta, y luego ordenado por el país orden del código

por lo que tendría una tabla que se parece a

CountryOrder 

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

y luego el código que se parece a:

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

Cómo sobre el uso IF para asignar el valor superior para las filas de Estados Unidos.

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

Esto le dará una pseudocolumna llamada sort_country_cd. Aquí puede asignar "EE. UU." A "aaaUS". JP todavía se pueden mapear a JP.

Eso pone a los EE. UU. En la parte superior de su lista de clasificación.

+0

country_code SELECT, COUNTRY_NAME DE ORDEN país por IF (country_code IN ('CA' , 'US'), 0,1), country_name –

4

para sacar al país buscadas en primer lugar, y el resto alfabéticamente:

SELECT * 
FROM stores 
ORDER BY country = 'us' DESC, country ASC 
Cuestiones relacionadas