连接 3 个表的 MySQL 查询给出了错误的结果

标签 mysql sql join

我使用一个数据库(下面附上的结构)来处理请求对象(请求表)或回复请求(操作表)的用户。

Database structure

(注:request.user_request_id为请求者ID)

我想找到一个查询,为我提供一个月内发出请求或回复请求的用户以及请求数量、回复数量和总数(请求 + 回复)。

我有一个关于 2018 年 3 月的请求数量的有效查询:

SELECT user.email, COUNT(request.user_request_id) AS requests 
FROM request LEFT JOIN user ON request.user_request_id = user.id 
WHERE DATE_FORMAT(STR_TO_DATE(request.created_at, '%m-%d-%Y'), '%Y-%m') 
= '2018-03' 
GROUP BY user_request_id 
ORDER BY number desc;

还有一个是回复的数量:

SELECT user.email, COUNT(action.lender_id) AS replies 
FROM action LEFT JOIN user ON action.lender_id = user.id 
WHERE DATE_FORMAT(STR_TO_DATE(action.created_at, '%m-%d-%Y'), '%Y-%m') = 
'2018-03' 
GROUP BY lender_id 
ORDER BY number desc;

但如果我尝试在 3 个表中使用单个查询,就会出错。 (例如,对于发出 3 个请求和 4 个回复的用户,它给了我 9 个请求和 9 个回复。) 这是我使用的查询:

SELECT user.email, 
COUNT(request.user_request_id) AS requests, 
COUNT(action.lender_id) AS replies, 
COUNT(request.user_request_id) + COUNT(action.lender_id) AS total 
FROM request LEFT JOIN user ON user.id=request.user_request_id LEFT JOIN 
action ON request.object_id=action.object_id 
WHERE DATE_FORMAT(STR_TO_DATE(request.created_at, '%m-%d-%Y'), '%Y-%m') 
= '2018-03' 
OR DATE_FORMAT(STR_TO_DATE(action.created_at, '%m-%d-%Y'), '%Y-%m') = 
'2018-03' 
GROUP BY user.email 
ORDER BY total desc;

有人看到我做错了什么吗?

最佳答案

你不做同样的 LEFT JOIN

在第二个请求中,您使用 "action.lender_id = user.id" 在操作和用户之间进行连接,但在第三个查询中,您使用 "在请求和操作之间进行连接request.object_id=action.object_id" 所以基本上你不会得到相同的结果

关于连接 3 个表的 MySQL 查询给出了错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51789714/

相关文章:

mysql 问题使用来自 json 字符串的连接来获取一个唯一值

php - PHP 中外键的 MySQL INSERT 问题

php - 统计按月份 w 分组的状态的 SQL 查询。修订制度

mysql - 将 2 个 Mysql 查询合并为一个

mysql - 数据库结构/设计

mysql - 我怎样才能组合两个mysql查询来得到一个结果?

javascript - 仅连接并打印带有文本的值,并在之间添加逗号

MySQL:匹配三个表中的列

MySQL 查询 3 表内部连接只返回 1 行

mysql - 尝试限制 mysql 结果中显示的数量