Mysql 如何改进此查询以避免使用嵌套视图?
查找拜访与其保险公司相关的所有骨科医生(专业)的患者 数据库: 如何在一个查询中写入它 尝试: 到目前为止,我试图解决这个问题Mysql 如何改进此查询以避免使用嵌套视图?,mysql,sql,Mysql,Sql,查找拜访与其保险公司相关的所有骨科医生(专业)的患者 数据库: 如何在一个查询中写入它 尝试: 到目前为止,我试图解决这个问题 SELECT p.pid,p.pname,p.cid,COUNT(v.did) FROM Visits v JOIN Doctors d ON v.did=d.did JOIN Patient p ON p.pid=v.pid WHERE d.cid=p.cid and d.speciality="Orthopedist" GROUP BY p.
SELECT p.pid,p.pname,p.cid,COUNT(v.did)
FROM Visits v
JOIN Doctors d ON v.did=d.did
JOIN Patient p ON p.pid=v.pid
WHERE d.cid=p.cid and d.speciality="Orthopedist"
GROUP BY p.pid,p.cid;
INTERSECT
SELECT p.pid,d.cid,COUNT(d.did)
FROM Doctors d
JOIN Patient p ON p.cid=d.cid
WHERE d.speciality='Orthopedist'
GROUP BY d.cid;
也许是这样的:
SELECT
p.pname,
p.pid,
p.cid
FROM
Patient AS p
JOIN
(
SELECT v.pid,COUNT(o.did) as countv4d
FROM Doctors d
JOIN Visits v ON o.did=v.did
WHERE d.speciality='Orthopedist'
GROUP BY v.pid,d.cid;
) AS v
ON p.pid=v.pid
JOIN
(
SELECT o.cid, COUNT(o.did) as countd4i
FROM Doctors d
WHERE d.speciality='Orthopedist'
GROUP BY o.cid;
) AS i
ON p.cid=i.cid
WHERE
i.countd4i = v.countv4d
熟悉您拥有的数据:
第一个关键是了解您拥有的数据。在本例中,您有四张桌子
- 保险公司
- 病人
- 医生
- 拜访
左外连接
,您甚至可以找到从未看过医生的患者。如果使用了右外连接
,则只能找到就诊的患者
“如何过滤结果?”
。正确的观点。查看三个表患者
、医生
和就诊
是否包含保险公司信息<代码>患者和医生有一个公共字段。加入该公共字段以过滤结果
患者id
、患者姓名
、患者就诊次数
和同一保险公司的骨科医生总数。然后,您可以添加一个外部联接,该联接将在患者就诊次数
与同一保险公司的骨科医生总数
匹配的字段中筛选此派生表的结果。我并不是说这是最好的办法。这是我能想到的一种方法
- 一步一步地尝试,一旦你找到答案。把它作为一个单独的答案贴在这里。我会投赞成票来补偿你在这个问题上投的所有反对票
评论
,其他人和我将很乐意为您提供帮助
免责声明
我提供了实现这种逻辑的多种方法之一。我相信有很多方法可以更好地实现这一点
结果:
有关生成所需输出的正确查询,请参考@Ofek Ron的答案。我没有写查询的任何部分。这都是OP的努力。@Siva的解释:
这是第1-5部分的结果代码:
SELECT *
FROM Patient p
JOIN Visits v ON v.pid=p.pid
JOIN Doctors d ON d.did=v.did and d.cid=p.cid
WHERE d.speciality="Orthopedist"
适用第6部分:
SELECT p.pid,COUNT(d.did)
FROM Patient p
JOIN Visits v ON v.pid=p.pid
JOIN Doctors d ON d.did=v.did and d.cid=p.cid
WHERE d.speciality="Orthopedist"
GROUP BY p.pid
应用其余部分:
我试过。。。这是一个比前一个更复杂的形式,这次我没有看到一个方法,除了计算正交,然后计算访问,然后比较他们。。。我所能避免的就是使用orthos的视图…@siva也许你能帮我想想逻辑方向
SELECT p.pid,COUNT(d.did)
FROM Patient p
JOIN Visits v ON v.pid=p.pid
JOIN Doctors d ON d.did=v.did and d.cid=p.cid
WHERE d.speciality="Orthopedist"
GROUP BY p.pid
SELECT p.pid,p.cid,COUNT(DISTINCT d.did) as c
FROM Patient p
JOIN Visits v ON v.pid=p.pid
JOIN Doctors d ON d.did=v.did and d.cid=p.cid
WHERE d.speciality="Orthopedist"
GROUP BY p.pid
HAVING (p.cid,c) IN
(SELECT d.cid,COUNT(DISTINCT d.did)
FROM Doctors d
WHERE d.speciality="Orthopedist"
GROUP BY d.cid);