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