2008-12-30 39 views
1

如何將結果集限制爲n給定列的不同值,其中實際行數可能會更高?如何做「限制不同」的等價物?

輸入表:

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 

期望的輸出,其中限制不同= 5個不同的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 

平臺這是用於是MySQL的。

回答

11

您可以使用子查詢

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

我認爲這是正確的,但我會離開的問題打開看一小會兒,如果其他人有更好的答案 – 2008-12-30 16:30:34

0

這是SQL Server。我不記得,MySQL可能會使用LIMIT關鍵字而不是TOP。如果可以通過在同一子查詢中使用LIMIT和DISTINCT來擺脫最內部的子查詢,可能會使查詢更有效。 (它看起來像Vinko用這種方法和限制是正確的。我會在這裏,雖然離開這個第二個可能的答案。)

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 
    ) 

當然,加在自己的WHERE子句和ORDER BY的子句子查詢。

另一種可能性(比較性能,看看哪個更好的作品出來)是:

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 
    )