我试图找到患者的预约和消息计数。我的表记录如下表3患者,约会和消息
患者表
pid fname lname
1 john sid
2 rother ford
3 megan rough
4 louis kane
约会表
id pid appointment_date
1 1 2015-08-04
2 2 2015-08-05
3 1 2015-08-06
4 1 2015-08-07
5 3 2015-08-07
6 2 2015-08-08
7 4 2015-08-13
8 1 2015-08-12
消息表
id pid description message_date
1 2 join 2015-08-04
2 2 update 2015-08-05
3 3 join 2015-08-05
4 4 update 2015-08-10
5 3 test 2015-08-07
因此,如果写查询以查找计数错误值
SELECT pd.fname,pd.lname , pd.pid, COUNT( a.id ) AS app_cnt, COUNT( m.id ) AS mes_cnt
FROM patient pd
LEFT OUTER JOIN appointments a ON a.pid = pd.pid
LEFT OUTER JOIN messages m ON m.pid = pd.pid
GROUP BY pd.pid
ORDER BY pd.pid
fname lname pid app_cnt mes_cnt
john sid 1 4 0
rother ford 2 4 4
megan rough 3 2 2
louis kane 4 1 1
这里pid 1有4个约会和0个消息,pid 2有2个约会和2个消息但是得到错误的值。
有人可以帮助解决此问题。我对编写子查询不感兴趣。
功能看起来很简单,但我真的面临编写查询的问题。
请再说一遍。
答案 0 :(得分:0)
在彻底分析你的问题和表之后,不能直接使用简单查询来完成,因为LEFT OUTER JOIN
正在返回一些多余的记录,这就是为什么要过滤它,你将不得不使用临时表并将查询修改为:
Select temp.fname, temp.lname, temp.pid, a_count, count(m.pid) as m_count from
(SELECT fname,lname,pd.pid, count(a.pid) as a_count
FROM patients pd
LEFT OUTER JOIN appointments a ON a.pid = pd.pid group by pd.pid) temp
LEFT OUTER JOIN messages m ON m.pid = temp.pid
group by temp.pid
说明:
它会加入patients
和appointments
表,并按pid
对其进行分组,以便messages
message table
不会重复每个patients.pid
错误的结果是左外连接的结果,因为它为此查询提供了错误的结果
SELECT *
FROM patients pd
LEFT OUTER JOIN appointments a ON a.pid = pd.pid
LEFT OUTER JOIN messages m ON m.pid = pd.pid
由于我们需要限制前两个连接的结果,因此临时表是必需的。