我正试图获得每个用户的前三个兴趣,可能是LEFT JOIN查询。
应用程序的设计方式,每个用户都有一组兴趣,这些兴趣只是parent
表的“孩子”(没有categories
的行)。
以下是一些带有模拟数据的简化表格模式(参见 SQL Fiddle demo )
-- Users table
| ID | NAME |
--------------
| 1 | John |
| 2 | Mary |
| 3 | Chris |
-- Categories table -- Interests table
| ID | NAME | PARENT | | ID | USER_ID | CATEGORY_ID |
-------------------------------------- ------------------------------
| 1 | Web Development | (null) | | 1 | 1 | 1 |
| 2 | Mobile Apps | (null) | | 2 | 1 | 1 |
| 3 | Software Development | (null) | | 3 | 1 | 1 |
| 4 | Marketing & Sales | (null) | | 4 | 2 | 1 |
| 5 | Web Apps | 1 | | 5 | 2 | 1 |
| 6 | CSS | 1 | | 6 | 3 | 1 |
| 7 | iOS | 2 | | 7 | 3 | 1 |
| 8 | Streaming Media | 3 | | 8 | 3 | 1 |
| 9 | SEO | 4 |
| 10 | SEM | 4 |
为了获得给定用户的前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名categories
(父母)
我想了解如何查询users表并在3个不同的字段(首选)中获取前三个类别,或者在一个字段中将其作为group_concat(..)
SELECT id, name, top_categories FROM users, (...) WHERE id IN ('1', '2', '3');
我应该怎么做才能做到这一点? 谢谢!
答案 0 :(得分:0)
首先构建一个groped查询,列出不同的行,每个用户的前三个技能。然后将其转入,将eah用户的三项技能拉到右侧。您需要对每个技能专栏中的技能使用Max(isnull(技能,''))表达。
答案 1 :(得分:0)
在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 ;
希望有所帮助