Mysql 根据最大发生次数和用户名的最大值选择记录

Mysql 根据最大发生次数和用户名的最大值选择记录,mysql,Mysql,以下查询工作正常: SELECT user.username, preference.user_id, preference.category,COUNT(*) AS occurrences FROM preference inner JOIN user on preference.user_id=user.userid where category is not null and category!="" GROUP BY category,user_id ORDER BY

以下查询工作正常:

SELECT user.username, preference.user_id, preference.category,COUNT(*) AS occurrences 
  FROM preference inner 
  JOIN user on preference.user_id=user.userid
 where category is not null and category!=""
 GROUP BY category,user_id 
 ORDER BY occurrences DESC ;
我只想

对于每个用户名,仅获取最流行的类别,即出现次数最多的类别,因此对于上面的小提琴,对于user1,它将是服装、鞋和配件3次出现,对于user2 Antique 3次出现,除了这两次出现之外,示例中的所有其他行都应省略


BAnother查询要为每个用户名获取第二个最流行的类别

您可以使用变量仅为每个用户选择两个最流行的类别

SELECT * FROM (
    SELECT * ,
    @rowNum := IF(@prevUserId = user_id,@rowNum+1,1) rowNum,
    @prevUserId := user_id
    FROM (
        SELECT user.username,@prevUserId,preference.user_id, category, COUNT(*) AS occurrences
        FROM preference inner JOIN user 
        on preference.user_id=user.userid
        where category is not null and category!=""
        GROUP BY category,preference.user_id
    ) t1 order by user_id, occurrences desc
) t1 WHERE rowNum <= 2

查询返回了多个用户名,这将只返回列表中出现次数最多的第一个用户名,但我们将丢失所有其他用户名的所有信息。类别列来自哪个表?此外,您在MySQL中误用了有害的扩展组,因此您的查询返回了一些随机选择的用户名。首选项表,我已经更新了问题,除了所解释的附加功能外,现有查询正在按预期工作。您不需要交叉连接,您的IF处理@prevUserId为Null并正确设置@rowNum。谢谢您的回答,但这仍然会返回每个用户的所有类别,其中一些类别的行号为1和2。@Athanatos您可以发布一个小提琴来重现这个问题吗?