Mysql 将前3个兴趣字段与每个用户行合并

Mysql 将前3个兴趣字段与每个用户行合并,mysql,sql,greatest-n-per-group,group-concat,Mysql,Sql,Greatest N Per Group,Group Concat,我试图获得每个用户的前3个兴趣,可能是一个左连接查询 按照应用程序的设计方式,每个用户都有一组兴趣,这些兴趣只不过是没有类别表父项的“childs”行 下面是一些带有模拟数据的简化表模式,请参见 为了获得给定用户的前3个兴趣,我通常执行以下查询: SELECT `c`.`parent` as `category_id` FROM `interests` `i` LEFT JOIN `categories` `c` ON `c`.`id` = `i`.`category_id` WHERE `

我试图获得每个用户的前3个兴趣,可能是一个左连接查询

按照应用程序的设计方式,每个用户都有一组兴趣,这些兴趣只不过是没有类别表父项的“childs”行

下面是一些带有模拟数据的简化表模式,请参见

为了获得给定用户的前3个兴趣,我通常执行以下查询:

SELECT `c`.`parent` as `category_id` 
FROM `interests` `i` LEFT JOIN `categories` `c` ON `c`.`id` = `i`.`category_id` 
WHERE `i`.`user_id` = '2' 
GROUP BY `c`.`parent` 
ORDER BY count(`c`.`parent`) DESC LIMIT 3
此查询返回id为2的用户的前3个类别的父级

我想了解如何查询users表,并在3个不同的首选字段或作为一个组获取他们的前3个类别。。在一个领域

SELECT id, name, top_categories FROM users, (...) WHERE id IN ('1', '2', '3');
你知道我该怎么做吗?
谢谢

首先构建一个摸索式查询,在不同的行中列出每个用户的前三项技能。然后将其旋转到右侧,将eah用户的三项技能拉到右侧。您需要在每个技能列中的技能上使用Maxisnullskill表达式。

在MYSQL中获得每个用户的前3条记录是一种非常粗糙的方法

 SELECT u.id, c.name 
 FROM 
     users u, 
     categories c, 
     (SELECT i.id, 
         i.user_id, 
         i.category_id, 
         @running:=if(@previous=i.user_id,@running,0) + 1 as rId,
         @previous:=i.user_id
     FROM 
         (SELECT * FROM intersect ORDER BY user_id) i JOIN 
         (SELECT @running=0, @previous=0 ) r) i
 WHERE 
     u.id = i.USER_ID AND
     i.CATEGORY_ID = c.id AND 
     i.rId <= 3
 group by u.id, c.name ;
希望能有帮助


那么,您希望每个用户1,2,3对应一行吗?每一行都会显示它们的前3个类别?准确地说,比如:“1”、“John”、“cat_id1、cat_id2、cat_id3”或“1”、“John”、“cat_id1”、“cat_id2”、“cat_id3”?如果一个用户只有2个兴趣,那么您希望看到的第3个是空的;如果一个用户有4个兴趣,那么您希望看到的3个是什么规则?选择前3个?最后,上面的示例数据显示了用户1、2和3在所有情况下对Web开发都有相同的兴趣。您希望web开发列出3次,还是想要不同的兴趣?@xQbert如果一个用户只有2个兴趣,我不介意它是省略它还是在第3个兴趣上返回NULL。但是,结果必须是前3个类别字段。e、 g.如果一个用户对营销和销售最感兴趣,那么顶级类别的第一个预期结果应该是4,然后是他们最感兴趣的任何其他类别的家长。请您用一些代码说明您将如何做到这一点?谢谢我使用的是sql server,不是mySql,所以我对mySql的语法知识不足;我马上就要下线了。明天试试我。
 SELECT u.id, c.name 
 FROM 
     users u, 
     categories c, 
     (SELECT i.id, 
         i.user_id, 
         i.category_id, 
         @running:=if(@previous=i.user_id,@running,0) + 1 as rId,
         @previous:=i.user_id
     FROM 
         (SELECT * FROM intersect ORDER BY user_id) i JOIN 
         (SELECT @running=0, @previous=0 ) r) i
 WHERE 
     u.id = i.USER_ID AND
     i.CATEGORY_ID = c.id AND 
     i.rId <= 3
 group by u.id, c.name ;