MySQL有许多显示重复行
请帮助编写查询 我有三张桌子:MySQL有许多显示重复行,mysql,sql,many-to-many,duplicates,duplicate-data,Mysql,Sql,Many To Many,Duplicates,Duplicate Data,请帮助编写查询 我有三张桌子: +-------------------+ | Patient | | PatientPhysician | | Physician | +-------------------+ 查找PhysicianOrganizationId中名字、姓氏和DoB相似的患者 我将向您展示数据,以便您更好地了解问题: mysql> SELECT pt.Id, pt.FirstName, pt.LastName, pt.DoB
+-------------------+
| Patient |
| PatientPhysician |
| Physician |
+-------------------+
查找PhysicianOrganizationId中名字、姓氏和DoB相似的患者
我将向您展示数据,以便您更好地了解问题:
mysql> SELECT pt.Id, pt.FirstName, pt.LastName, pt.DoB, ph.PhysicianOrganizationId
-> FROM Patient pt, Physician ph, PatientPhysician pp
-> WHERE pt.Id = pp.IdPatient AND ph.Id = pp.IdPhysician
-> ORDER BY pt.Id;
+----+-----------+-------------+------------+-------------------------+
| Id | FirstName | LastName | DoB | PhysicianOrganizationId |
+----+-----------+-------------+------------+-------------------------+
| 1 | Mario | Gotze | 1989-01-09 | 101 |
| 2 | Mario | Gotze | 1989-01-09 | 102 |
| 3 | Mario | Gotze | 1989-01-09 | 101 |
| 4 | Fillip | Gotze | 1989-01-09 | 101 |
| 5 | Marco | Rues | 1988-09-12 | 102 |
| 5 | Marco | Rues | 1988-09-12 | 101 |
| 5 | Marco | Rues | 1988-09-12 | 103 |
| 6 | Dimitri | Payet | 1986-10-10 | 101 |
| 7 | Dimitri | Payet | 1986-10-10 | 101 |
| 8 | Dimitri | Payet | 1986-10-10 | 101 |
| 8 | Dimitri | Payet | 1986-10-10 | 102 |
| 9 | Zlatan | Ibrahimovic | 1982-01-12 | 103 |
| 9 | Zlatan | Ibrahimovic | 1982-01-12 | 101 |
| 10 | Zlatan | Ibrahimovic | 1982-01-12 | 101 |
| 10 | Zlatan | Ibrahimovic | 1982-01-12 | 103 |
+----+-----------+-------------+------------+-------------------------+
15 rows in set (0.01 sec)
我编写了一个查询,但结果不正确:
SELECT
pt.Id,
pt.FirstName,
pt.LastName,
pt.DoB,
ph.PhysicianOrganizationId
FROM Patient pt, Physician ph, PatientPhysician pp
WHERE pt.Id = pp.IdPatient AND ph.Id = pp.IdPhysician
GROUP BY pt.FirstName, pt.LastName, pt.DoB, ph.PhysicianOrganizationId
HAVING COUNT(*) > 1 ORDER BY pt.Id;
结果:
+----+-----------+-------------+------------+-------------------------+
| Id | FirstName | LastName | DoB | PhysicianOrganizationId |
+----+-----------+-------------+------------+-------------------------+
| 1 | Mario | Gotze | 1989-01-09 | 101 |
| 6 | Dimitri | Payet | 1986-10-10 | 101 |
| 9 | Zlatan | Ibrahimovic | 1982-01-12 | 103 |
| 9 | Zlatan | Ibrahimovic | 1982-01-12 | 101 |
+----+-----------+-------------+------------+-------------------------+
我需要这个结果:
+----+-----------+-------------+------------+-------------------------+
| Id | FirstName | LastName | DoB | PhysicianOrganizationId |
+----+-----------+-------------+------------+-------------------------+
| 1 | Mario | Gotze | 1989-01-09 | 101 |
| 3 | Mario | Gotze | 1989-01-09 | 101 |
| 6 | Dimitri | Payet | 1986-10-10 | 101 |
| 7 | Dimitri | Payet | 1986-10-10 | 101 |
| 8 | Dimitri | Payet | 1986-10-10 | 101 |
| 9 | Zlatan | Ibrahimovic | 1982-01-12 | 103 |
| 9 | Zlatan | Ibrahimovic | 1982-01-12 | 101 |
| 10 | Zlatan | Ibrahimovic | 1982-01-12 | 103 |
| 10 | Zlatan | Ibrahimovic | 1982-01-12 | 101 |
+----+-----------+-------------+------------+-------------------------+
告诉我我做错了什么?尝试将
pt.Id
添加到您的分组依据
子句中:
SELECT
pt.Id,
pt.FirstName,
pt.LastName,
pt.DoB,
ph.PhysicianOrganizationId
FROM
Patient pt,
Physician ph,
PatientPhysician pp
WHERE
pt.Id = pp.IdPatient
AND ph.Id = pp.IdPhysician
GROUP BY
pt.Id,
pt.FirstName,
pt.LastName,
pt.DoB,
ph.PhysicianOrganizationId
HAVING COUNT(*) > 1
ORDER BY pt.Id;
注意:我尚未测试上述SQL请尝试将
pt.Id
添加到您的groupby
子句中:
SELECT
pt.Id,
pt.FirstName,
pt.LastName,
pt.DoB,
ph.PhysicianOrganizationId
FROM
Patient pt,
Physician ph,
PatientPhysician pp
WHERE
pt.Id = pp.IdPatient
AND ph.Id = pp.IdPhysician
GROUP BY
pt.Id,
pt.FirstName,
pt.LastName,
pt.DoB,
ph.PhysicianOrganizationId
HAVING COUNT(*) > 1
ORDER BY pt.Id;
SELECT pt.Id, tmp1.fname, tmp1.lname, tmp1.dob, tmp1.poid
FROM (
SELECT pt.FirstName AS fname,
pt.LastName AS lname,
pt.DoB as dob,
ph.PhysicianOrganizationId AS poid
FROM Patient pt, Physician ph, PatientPhysician pp
WHERE pt.Id = pp.IdPatient AND ph.Id = pp.IdPhysician
GROUP BY fname, lname, dob, poid
HAVING COUNT(*) > 1) AS tmp1
JOIN Patient AS pt ON pt.FirstName = tmp1.fname AND pt.LastName = tmp1.lname AND pt.DoB = tmp1.dob
JOIN PatientPhysician AS pp ON pt.Id = pp.IdPatient
JOIN Physician AS ph ON ph.Id = pp.IdPhysician AND tmp1.poid = ph.PhysicianOrganizationId
ORDER BY pt.Id;
注意:我还没有测试上面的SQL我尝试过这个查询没有显示任何行。“空集(0.00秒)”我尝试了此查询,但未显示任何行。“空集(0.00秒)”太棒了!非常感谢你/当你在单词上犯小错误时,我会做出改变。太好了!非常感谢你/当你在单词上犯一些小错误时,我会做出改变。
SELECT pt.Id, tmp1.fname, tmp1.lname, tmp1.dob, tmp1.poid
FROM (
SELECT pt.FirstName AS fname,
pt.LastName AS lname,
pt.DoB as dob,
ph.PhysicianOrganizationId AS poid
FROM Patient pt, Physician ph, PatientPhysician pp
WHERE pt.Id = pp.IdPatient AND ph.Id = pp.IdPhysician
GROUP BY fname, lname, dob, poid
HAVING COUNT(*) > 1) AS tmp1
JOIN Patient AS pt ON pt.FirstName = tmp1.fname AND pt.LastName = tmp1.lname AND pt.DoB = tmp1.dob
JOIN PatientPhysician AS pp ON pt.Id = pp.IdPatient
JOIN Physician AS ph ON ph.Id = pp.IdPhysician AND tmp1.poid = ph.PhysicianOrganizationId
ORDER BY pt.Id;