Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用每个值选择k行_Mysql - Fatal编程技术网

Mysql 使用每个值选择k行

Mysql 使用每个值选择k行,mysql,Mysql,我的桌子: NAME SURNAME John Smith Jane Smith Alice Smith James Bond James Cameroon David Beckham 我有一个db,我想用每个姓氏选择k行。对于k=1,它是: 输出为: Alice Smith James Bond James Cameroon David Beckham 我找不到查询k=2的方法,如果出现2个史密斯,2个邦兹,2个喀麦隆人等,或者一般情况下:

我的桌子:

NAME    SURNAME
John    Smith
Jane    Smith
Alice   Smith
James   Bond
James   Cameroon
David   Beckham
我有一个db,我想用每个姓氏选择k行。对于k=1,它是:

输出为:

Alice   Smith
James   Bond
James   Cameroon
David   Beckham

我找不到查询k=2的方法,如果出现2个史密斯,2个邦兹,2个喀麦隆人等,或者一般情况下:k史密斯,k邦兹,k喀麦隆人等,我会在哪里得到。如果这个姓氏的人少于k,请选择所有人。在MySQL中可能吗?

您可以区分姓氏,并将其与相同的表连接,但仅限于您的k。这样,您将得到每个姓氏k行


您可以使用以下查询:

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中引用的样本表中选择所有记录


我相信你应该去看看clause@apomene我不明白你的意思。如果k=2,并且只有一个键,那么应该选择这个值吗?@GiorgosBetsos是的,我会将它添加到问题中。它只会在结果中添加一列。这是一个错误的答案:/这是艺术!谢谢请编辑更多信息。不鼓励只编码并尝试此答案,因为它们不包含可搜索的内容,并且不解释为什么有人应该尝试此答案。
SELECT Name,Surname,Count(SurName) AS k FROM people 
GROUP BY SURNAME
HAVING k>=2
SELECT DISTINCT(`surname`)
    LEFT JOIN (
            SELECT `name` FROM `people` p2 where p2.surname = p1.surname limit 2
        ) x
FROM `people` p1
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