有人可以指出我如何编写一个复杂的mysql查询的方向吗?我熟悉联接,视图和中间查询,但是不能完全概念化如何编写查询以提取所需的数据。
我有三个表,user,user_category和category。 user_category只是一个桥接表。
user
user_id name
-----------------------
1 Bob
2 Tim
3 Dave
4 Simon
5 Ben
user_category
user_id category_id
-----------------------
1 1
1 5
1 3
2 4
2 1
3 2
3 4
4 4
4 1
5 3
5 5
category
category_id category
-----------------------
1 drawing
2 climbing
3 hunting
4 fishing
5 sleeping
所以我可以轻松地提取出每个类别的用户列表,没问题。
对于这些类别中的每个类别,我要显示的是该类别中的用户列表所在的其他类别的列表。
因此,以钓鱼为例,我的查询将剔除蒂姆,戴夫和西蒙属于该类别。我想列出Tim Dave和Simon所在的所有其他类别,并统计每个类别中有多少用户。像这样:
Drawing (2) - this has Tim and Simon in it
Climbing (1) - this has Dave in it
我意识到我需要获取给定类别的用户列表。很简单。
我还需要列出这些用户每个人所在的所有类别(不包括当前类别)。
然后对于每个类别,我需要统计每个类别中的每个用户。
我想我可以使用单独的嵌套查询来编写此代码,但是我想尽可能使用所有必要的联接在单个查询中编写此代码,但是如果有人可以指出一些帮助我的阅读材料或视频内容,找出如何计划这些查询,那会更好。
答案 0 :(得分:1)
您需要多个表联接:
select cn.category, count(*) counter
from category c
inner join user_category uc on uc.category_id = c.category_id
inner join user u on u.user_id = uc.user_id
inner join user_category ucn
on ucn.user_id = u.user_id and ucn.category_id <> uc.category_id
inner join category cn on cn.category_id = ucn.category_id
where c.category = 'Fishing'
group by cn.category
请参见demo。
结果:
| category | counter |
| -------- | ------- |
| climbing | 1 |
| drawing | 2 |
答案 1 :(得分:0)
通过该查询,您可以获取数据,如果您想要特定的爱好,请为c.category ='fishing'添加一个where子句
SELECT
MIN(c.category), COUNT(*), GROUP_CONCAT(`name`)
FROM
user_category uc
INNER JOIN
user u ON uc.user_id = u.user_id
INNER JOIN
category c ON uc.category_id = c.category_id
GROUP BY
uc.category_id
这将返回以下结果:
MIN(c.category) Count(*) GROUP_CONCAT(`name`)
drawing 3 Bob,Tim,Simon
climbing 1 Dave
hunting 2 Ben,Bob
fishing 3 Tim,Dave,Simon
sleeping 2 Bob,Ben
DBfiddle示例 https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=ad26cf2ab673d349f82d8875022af2aa