2008-12-30 8 views
1

Comment limiter un jeu de résultats à n valeurs distinctes d'une ou de plusieurs colonnes, où le nombre réel de lignes peut être supérieur?Comment faire l'équivalent de "limite distincte"?

table d'entrée:

client_id, employer_id, other_value 
1, 2, abc 
1, 3, defg 
2, 3, dkfjh 
3, 1, ldkfjkj 
4, 4, dlkfjk 
4, 5, 342 
4, 6, dkj 
5, 1, dlkfj 
6, 1, 34kjf 
7, 7, 34kjf 
8, 6, lkjkj 
8, 7, 23kj 

sortie désirée, où la limite distincte = 5 valeurs distinctes de client_id:

1, 2, abc 
1, 3, defg 
2, 3, dkfjh 
3, 1, ldkfjkj 
4, 4, dlkfjk 
4, 5, 342 
4, 6, dkj 
5, 1, dlkfj 

plate-forme est destinée à ce que MySQL.

Répondre

11

Vous pouvez utiliser un sous-

select * from table where client_id in 
(select distinct client_id from table order by client_id limit 5) 
+0

Je pense que cela est juste, mais je vais laisser la question ouverte pour un peu de temps pour voir si quelqu'un d'autre a une meilleure réponse –

+0

Pouvez-vous faire des requêtes 'SELECT IN' dans MySQL? –

+0

Dans 5.X vous pouvez. –

0

Ceci est pour SQL Server. Je ne me souviens pas, MySQL peut utiliser un mot-clé LIMIT au lieu de TOP. Cela peut rendre la requête plus efficace si vous pouvez vous débarrasser de la sous-requête la plus interne en utilisant LIMIT et DISTINCT dans la même sous-requête. (Il ressemble à Vinko utilisé cette méthode et cette limite est correcte. Je vais laisser ce pour la deuxième réponse possible cependant.)

SELECT 
    client_id, 
    employer_id, 
    other_value 
FROM 
    MyTable 
WHERE 
    client_id IN 
    (
      SELECT TOP 5 
       client_id 
      FROM 
      (
       SELECT DISTINCT 
        client_id 
       FROM 
        MyTable 
     ) SQ 
      ORDER BY 
       client_id 
    ) 

Bien sûr, ajoutez dans votre propre clause WHERE et la clause ORDER BY dans la sous-requête.

Une autre possibilité (comparer les performances et voir ce qui fonctionne mieux) est:

SELECT 
    client_id, 
    employer_id, 
    other_value 
FROM 
    MyTable T1 
WHERE 
    T1.code IN 
    (
      SELECT 
       T2.code 
      FROM 
       MyTable T2 
      WHERE 
       (SELECT COUNT(*) FROM MyTable T3 WHERE T3,code < T2.code) < 5 
    ) 
Questions connexes