首页 > 解决方案 > 连接 3 个表的 MySQL 查询给出错误的结果

问题描述

我对请求对象(请求表)或回复请求(操作表)的用户使用数据库(结构如下)。

数据库结构

(注: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;

有人看到我做错了吗?

标签: mysqlsqljoin

解决方案


你没有做同样的 LEFT JOIN

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


推荐阅读