2010-02-02 8 views
5

En una tabla que contiene quiero conseguir las cinco ciudades más grandes y ordenarlas por nombre:ciudades de pedido y limitar

SELECT * FROM ciudades ORDER BY población DESC LIMIT 5

que me pone las ciudades más grandes ordenado por población, pero quiero las mismas ciudades ordenadas por nombre. ¿Hay una manera fácil de hacer esto (sin recurrir a una subconsulta o clasificar las ciudades luego con PHP)?

Gracias.

Respuesta

1
SELECT * FROM cities ORDER BY population desc, name LIMIT 5 
+0

Debería, por favor, publicar algunos datos de muestra y su salida. – RedFilter

+0

Consigue las cinco ciudades más grandes, pero las clasifica por población, no por nombre (a menos que las 5 principales tengan exactamente la misma población, lo que es muy poco probable). –

+0

Oh, ya veo. No entendí lo que estabas pidiendo. – RedFilter

0

SELECT * FROM ciudades ORDER BY DESC población, nombre LÍMITE 5

¿Usted intentó esto? Creo que esto puede funcionar

0

Basta con hacer

SELECT y.* 
    FROM (SELECT name FROM cities ORDER BY population DESC LIMIT 5) AS x, 
     cities AS y 
WHERE x.name = y.name 
ORDER BY y.name 

Eso es todo lo que hay para ello.

Saludos.

+0

Ah, bien, ahora sé lo que quiere lograr: necesitará un JOIN, así:. y SELECT * FROM (SELECT nombre a ciudades ORDER BY población DESC) como X, ciudades como Y WHERE x.name = y.name PEDIDO POR x.nombre – aefxx

0

usted va a necesitar una subconsulta:

SELECT a.* 
FROM (
    SELECT * 
    FROM cities 
    ORDER BY population DESC 
    LIMIT 5 
) a 
ORDER BY name; 

EDIT: acabo de ver que no desea una subconsulta. Por qué no? Esa es una consulta eficiente que regresará muy rápidamente (debe haber un índice de población con o sin una subconsulta).

+0

No es que no quiera una subconsulta. Es solo que pensé que había una solución obvia que de alguna manera no vi. – Jonas

0
mysql> create temporary table temp (ID int); 
mysql> insert into temp select ID from cities order by population desc limit 5; 
mysql> select a.* from cities a,temp b where a.ID=b.ID order by Name; 

Las tablas temporales se eliminan cuando la conexión se cierra, o se pueden soltar manualmente. Las tablas temporales no se pueden ver desde otras conexiones. La manera normal sería (pero no es compatible aún):

mysql> select * from cities where ID in (select ID from cities order by population desc limit 5) order by Name; 

Pero la respuesta es:

ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' 

(probado con 5.0.5)

+0

ggiroux dijo que funciona con 5.0.5: (SELECCIONAR * FROM ciudades ORDENAR por población población DESC LÍMITE 5) PEDIR POR nombre; ¡Dale un punto! :-) – Notinlist

9

Creo que lo que quiere es esto:

(SELECCIONAR * FROM ciudades ORDENAR POR población población DESC LÍMITE 5) PEDIR POR nombre;

+0

Funciona para mí con 5.0.5 – Notinlist

+0

¡La solución más simple hasta ahora! – Jonas

+0

Eso es elegante. Me gusta. –