Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何改进此查询以避免使用嵌套视图?_Mysql_Sql - Fatal编程技术网

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
熟悉您拥有的数据: 第一个关键是了解您拥有的数据。在本例中,您有四张桌子

  • 保险公司
  • 病人
  • 医生
  • 拜访
你的目标是: 查找拜访与其保险公司相关的所有骨科医生(专业)的所有患者的列表

让我们后退一步,用小块来分析: 一般来说,从整体上看,需求可能有点难以满足。让我们将需求分成更小的组件,以了解您需要做什么

  • a部分:你需要找到医生名单,他们的专业是“骨科医生”
  • b部分:查找第1部分中确定的就诊患者名单
  • c部分:过滤结果#2以查找共享同一保险公司的患者和医生的列表
  • 第四部分:找出与患者属于同一家保险公司的骨科医生就诊的患者
  • 如何处理:
  • 您需要确定您的主要目标,在本例中,您需要确定患者名单。因此,首先查询患者表

  • 你有病人,实际上他们都有,但我们需要找到这些病人中的哪一个去看医生。我们不要担心医生是否是骨科医生。我们只需要病人和他们看过的医生的名单。“患者”和“医生”表之间没有映射。要了解这些信息

    将患者表与就诊表连接到正确的关键字段

    然后将输出与正确键字段上的医生表连接起来

  • 如果您正确地完成了连接,您现在应该拥有所有患者及其就诊医生的列表。如果您使用
    左外连接
    ,您甚至可以找到从未看过医生的患者。如果使用了
    右外连接
    ,则只能找到就诊的患者

  • 现在,你有了所有的病人和他们拜访过的医生。然而,要求是只找到骨科医生。因此,应用条件过滤结果以仅给出所需结果

  • 现在,您已经实现了在第a部分和第b部分中划分为更小组件的要求。你仍然需要保险公司对其进行筛选。这里是一个棘手的部分,要求没有说你需要显示保险公司,所以我们不必使用表InsuranceCompanys。您的下一个问题是
    “如何过滤结果?”
    。正确的观点。查看三个表
    患者
    医生
    就诊
    是否包含保险公司信息<代码>患者和医生有一个公共字段。加入该公共字段以过滤结果

  • 查找每位患者访问过的唯一骨科医生的数量

  • 这是可以通过多种方式完成的部分,其中一种方法是添加一个子查询,它将是输出中的第四列。此子查询将查询医生表,并按专业=“骨科医生”进行筛选。除了该过滤器外,还必须通过将内部表上的保险公司与主查询中的Patients表上的保险公司id相匹配来进行过滤。此子查询将返回与患者数据匹配的保险公司id的所有骨科医生的计数

  • 您现在应该可以从子查询中获得
    患者id
    患者姓名
    患者就诊次数
    同一保险公司的骨科医生总数。然后,您可以添加一个外部联接,该联接将在
    患者就诊次数
    与同一保险公司的
    骨科医生总数
    匹配的字段中筛选此派生表的结果。我并不是说这是最好的办法。这是我能想到的一种方法

  • 如果你遵循上述逻辑,你应该有这个

  • 看过所有医生的病人名单

    仅由医生筛选,他们是骨科医生

    由共享相同保险公司信息的患者和医生过滤

    同样,整个输出由派生表输出中的两个count字段过滤

    球在你的球场上:
    • 一步一步地尝试,一旦你找到答案。把它作为一个单独的答案贴在这里。我会投赞成票来补偿你在这个问题上投的所有反对票
    我相信你可以轻松做到这一点

    如果你绊倒了。。。 请毫不犹豫地将您的问题发布为此答案的
    评论
    ,其他人和我将很乐意为您提供帮助

    免责声明 我提供了实现这种逻辑的多种方法之一。我相信有很多方法可以更好地实现这一点

    结果: 有关生成所需输出的正确查询,请参考@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);