2010-02-02 2 views
5

Dans un tableau contenant les villes que je veux obtenir les cinq plus grandes villes et les commander par nom:Commande et limites

SELECT * FROM villes ORDER BY population DESC LIMIT 5

qui me fait les plus grandes villes commandées par la population, mais je veux les mêmes villes classées par nom. Existe-t-il un moyen facile de faire cela (sans passer par une sous-requête ou trier les villes par la suite avec PHP)?

Merci.

Répondre

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

Il devrait, s'il vous plaît envoyer quelques exemples de données et votre sortie. – RedFilter

+0

Il obtient les cinq plus grandes villes, mais les trie par la population, pas le nom (à moins que le top 5 arrive à avoir exactement la même population qui est hautement improbable). –

+0

Oh, je vois. J'ai mal compris ce que vous demandiez. – RedFilter

0

SELECT * FROM villes ORDER BY population DESC, nom LIMITE 5

Avez-vous essayé cela? Je pense que cela peut fonctionner

0

Il suffit de faire

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 

Voilà tout ce qui est à lui.

Vive.

+0

Ah, ok maintenant je sais ce que vous voulez atteindre: Vous aurez besoin d'un JOIN, comme suit:. SELECT y * FROM (SELECT nom des villes ORDER BY population DESC) AS x, villes AS y WHERE x.name = y.name ORDER BY x.name – aefxx

0

Vous allez avoir besoin d'une sous-requête:

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

EDIT: Je viens de voir que vous ne voulez pas un sous-requête. Pourquoi pas? C'est une requête efficace qui retournera très rapidement (il devrait y avoir un index sur la population avec ou sans sous-requête).

+0

Ce n'est pas que je ne veux pas de sous-requête. C'est juste que je pensais qu'il y avait une solution évidente que je ne voyais pas d'une manière ou d'une autre. – 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; 

Les tables temporaires sont supprimés lorsque la connexion est fermée, ou ils peuvent être déposés manuellement. Les tables temporaires ne peuvent pas être vues à partir d'autres connexions. La façon normale serait (mais il est encore non pris en charge):

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

Mais la réponse est:

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

(essayées avec 5.0.5)

+0

ggiroux dit qui fonctionne avec 5.0.5: (SELECT * FROM villes ORDER BY population DESC LIMIT 5) ORDER BY name; Donnez-lui un point! :-) – Notinlist

9

Je pense que ce que vous voulez est ceci:

(SELECT * FROM villes ORDER BY population DESC LIMIT 5) ORDER BY name;

+0

Fonctionne avec moi avec 5.0.5 – Notinlist

+0

La solution la plus simple jusqu'à présent! – Jonas

+0

C'est élégant. J'aime ça. –