2010-05-03 4 views
1

salut j'ai une table comme suit id, école, adresse, ville, état, téléphone, email, fax. Il y a près de 40 villes. Je dois sélectionner 1 entrée de chaque ville. quelqu'un peut me guidermysql requête pour ce problème

exemple

city 

a1  30 entries 

a2  12 entries 

...... 
a40 36 entries 

Pick 1 from each a1,a40 
+2

Quels sont les critères que vous souhaitez utiliser pour choisir l'entrée de chaque ville est sélectionnée? – Syntactic

+1

La plupart des entrées de la même ville n'auraient-elles pas le même état? Pouvez-vous élaborer, s'il vous plaît? – Syntactic

+0

Ok, prenez ceci comme les 10 États ont chacun 5-6 villes chacun. J'ai simplement besoin de sélectionner une entrée de chaque ville (strictement pas plus de 1 de 50 à 100 entrées de chaque ville) au hasard. – ArK

Répondre

2
select * 
    from table_name 
where id in ( select MAX(id) 
        from table_name 
       group by city 
      ) 
+1

Pourquoi cela a-t-il eu un vote négatif? Soupir .. un peu grossier mais on dirait que ça devrait marcher! – lexu

+0

Oui, je suis d'accord avec @lexu – Aditya

+0

Juste enlevé mon downvote, il était précédemment la syntaxe invalide. – Michael

0
select * from your_table_name group by state, city 

et avec un Aléatoire Choisir

select * from your_table_name group by state, city order by rand() 
+0

dans ** mysql ** c'est la réponse la plus simple et la plus courte à la question. +1 pour contrer le (s) downvoter (s)! – knittl

0

dans une base MySQL, vous pouvez dire simplement:

select * from table group by city 
+0

Je ne pense pas que ce soit une bonne idée: http://dev.mysql.com/doc/refman/5.0/fr/group-by-hidden-columns.html –

+0

@mark byers: alors où est le problème? la page parle de sql standard. J'ai clairement indiqué que je parle de mysql, et afaik dans mysql il est possible de sélectionner des colonnes sans les agréger. La ligne que vous obtenez est non spécifiée, mais vous obtenez des valeurs ... – knittl

+0

Il est dit "Lorsque vous utilisez cette fonctionnalité, toutes les lignes de chaque groupe doivent avoir les mêmes valeurs pour les colonnes qui sont omises de la partie GROUP BY." Ce n'est pas le cas ici. –

4

En général, je préfère aborder ces cas avec une jointure à une sous requête, comme dans l'exemple suivant:

SELECT s.id, s.school, s.address, s.city, s.phone, s.email, s.fax 
FROM  schools s 
JOIN  (SELECT MAX(id) as max_id 
      FROM  schools 
      GROUP BY city) sub_s ON (sub_s.max_id = s.id); 

Le JOIN est pratiquement le résultat restreindre mis aux entrées avec des villes distinctes. Cela suppose également que vous voulez sélectionner l'entrée avec l'ID le plus élevé lorsque vous avez plusieurs entrées pour chaque ville. Si vous préférez choisir l'ID le plus bas, vous pouvez utiliser la fonction d'agrégat MIN() dans la sous-requête au lieu de MAX().

+0

+1 pour l'explication, vaut beaucoup plus que la requête seule. – lexu