2016-09-12 62 views
-1

我的表:選擇k行與每個值

NAME SURNAME 
John Smith 
Jane Smith 
Alice Smith 
James Bond 
James Cameroon 
David Beckham 

我有一個分貝,我想選擇k行,每SURNAME。對於k=1是:

SELECT * FROM people GROUP BY SURNAME; 

,輸出是:

Alice Smith 
James Bond 
James Cameroon 
David Beckham 

我不能找到一種方法來查詢k=2,在那裏我會得到(如果存在的話)2個史密斯,2只債券,2喀麥隆等國家或一般:k史密斯,k債券,k喀麥隆等。如果有少於k的人與此SURNAME選擇所有這些。是否有可能在MySQL

+0

我相信你應該看看和having子句 – apomene

+0

@apomene我不明白你的意思。 – xenteros

+0

如果'k = 2'並且只有'1''Bond',是否應該選擇這個值? –

回答

1

您可以使用下面的查詢:

SELECT NAME, SURNAME 
FROM (
    SELECT NAME, SURNAME, 
     @rn := IF(@s = SURNAME, @rn + 1, 
        IF(@s := SURNAME, 1, 1)) AS rn 
    FROM mytable 
    CROSS JOIN (SELECT @rn := 0, @s = '') AS vars 
    ORDER BY SURNAME) AS t 
WHERE t.rn <= 3 

上面的查詢顯示k=3一個例子。它將選擇OP中引用的樣本表中的所有記錄。

Demo here

+0

這就是藝術!謝謝! – xenteros

0
SELECT Name,Surname,Count(SurName) AS k FROM people 
GROUP BY SURNAME 
HAVING k>=2 
+0

它只會在結果中添加一列。這是一個錯誤的答案:/ – xenteros

-1

您可以可以不同的surname並用相同的表連接,但僅限於您k。這樣你會得到每個surnamek

SELECT DISTINCT(`surname`) 
    LEFT JOIN (
      SELECT `name` FROM `people` p2 where p2.surname = p1.surname limit 2 
     ) x 
FROM `people` p1 
+0

請編輯更多信息。僅限代碼和「嘗試這個」的答案是不鼓勵的,因爲它們不包含可搜索的內容,也不解釋爲什麼有人應該「嘗試這個」。 – abarisone

+0

@abarisone謝謝,編輯。 –