无法找出复杂的查询

时间:2019-10-31 20:04:58

标签: mysql join left-join

有人可以指出我如何编写一个复杂的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

我意识到我需要获取给定类别的用户列表。很简单。

我还需要列出这些用户每个人所在的所有类别(不包括当前类别)。

然后对于每个类别,我需要统计每个类别中的每个用户。

我想我可以使用单独的嵌套查询来编写此代码,但是我想尽可能使用所有必要的联接在单个查询中编写此代码,但是如果有人可以指出一些帮助我的阅读材料或视频内容,找出如何计划这些查询,那会更好。

2 个答案:

答案 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