Mysql 无法理解复杂的查询

Mysql 无法理解复杂的查询,mysql,join,left-join,Mysql,Join,Left Join,有人能告诉我如何编写复杂的mysql查询吗?我熟悉联接、视图和中间查询,但不能完全概念化如何编写查询以提取我正在查找的数据 我有三个表,user,user\u category和category。用户类别只是一个桥接表 user user_id name ----------------------- 1 Bob 2 Tim 3 Dave 4 Simon 5 Ben user_categor

有人能告诉我如何编写复杂的mysql查询吗?我熟悉联接、视图和中间查询,但不能完全概念化如何编写查询以提取我正在查找的数据

我有三个表,user,user\u category和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划入这一类。我想列出Tim Dave和Simon所处的所有其他类别,并统计每个类别中的用户数量。像这样:

Drawing (2) - this has Tim and Simon in it
Climbing (1) - this has Dave in it
我意识到我需要得到一个给定类别的用户列表。简单

我还需要一个所有类别的列表,这些用户中的每一个都在排除当前类别

然后,对于每个类别,我需要对每个类别中的每个用户进行计数


我想我可以用单独的嵌套查询来写这个,但是如果可能的话,我想用所有必要的连接在一个查询中写这个,但是如果有人能告诉我一些阅读材料或视频内容,可以帮助我规划这些查询,那就更好了。

通过这个查询,你可以得到你的数据,如果您想要一个特定的爱好,可以为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示例

您需要多个表的联接:

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

这个示例数据的预期输出是什么?正如我所提到的,如果我选择钓鱼作为类别,我希望返回一个数组,其中包含两个类别和每个类别中的用户数:绘图2-这有Tim和Simon在其中,攀登1-这有Dave在其中请在代码问题中给出一个-剪切&粘贴&可运行代码;作为初始化代码的示例输入,所需和实际输出包括逐字错误消息;标签和版本;清晰的说明和解释。这包括您能给出的最少代码,即您显示为OK的代码,由您显示为not OK的代码扩展。调试基础。对于包含DBMS/product和DDL的SQL,其中包括约束、索引和表格格式初始化。请展示你能做的部分。请参阅,其他链接和文本上方的投票箭头鼠标。在给出业务关系/关联、表基或查询结果时,请说明其中的一行根据其列值对业务状况的说明。请通过编辑澄清,而不是评论。寻求外部资源是不恰当的。但数十本已出版的学术信息建模与数据库设计与查询教科书都是pdf格式的在线免费教科书。斯坦福大学有一个免费的在线课程。PS在考虑发帖之前,请始终用谷歌搜索你的错误信息或你的问题/问题/目标的许多清晰、简洁和准确的措辞,无论有没有网站:stackoverflow.com。这是惊人的。-有什么推荐的阅读或在线课程可以帮助我了解你是如何运用这种方法的吗?对不起,我不能推荐在线课程。只要学习SQL的任何内容,在这里你就会找到很多好的资料。很好的解决方案!也许可以通过删除u.user_id=uc.user_id行上的内部连接用户u,并在下面的on子句中将对u.user_id的引用替换为uc.user_id来实现进一步简化,请参见此处的演示:从forpas的原始fiddle修改
| category | counter |
| -------- | ------- |
| climbing | 1       |
| drawing  | 2       |