执行多对多查询筛选|MySQL

z8dt9xmd  于 2023-05-21  发布在  Mysql
关注(0)|答案(1)|浏览(131)

我有四张table:

  • 药物
  • 制造商
  • 药品生产商
  • 药物报告

药品表
| 身份证|姓名|
| --------------|--------------|
| 1|第1行|
| 2|第二排|
制造商表:
| 身份证|姓名|
| --------------|--------------|
| 1| ДИГОКСИН ТАБЛ。0,25 МГ №40|
| 2|药物名称54|
药品生产商表
| 药品ID|制造商ID|计数器|
| --------------|--------------|--------------|
| 1| 3| 1|
| 1|四十五|2|
和drug_reports表
| 身份证|周期码|药品ID|制造商ID|日期|
| --------------|--------------|--------------|--------------|--------------|
| 1|公司简介|1| 3| 2023年1月1日|
| 2| A101| 1|四十五|2023年1月1日|
| 3| A102系列|2| 3| 2023年1月1日|
所以我创建了如下查询:

SELECT dr.id, dm.counter, dr.period_code, dr.drug_id, d.name, m.name FROM drug_reports dr
LEFT JOIN drugs d ON dr.drug_id = d.id
LEFT JOIN drug_manufacturers dm ON d.id = dm.drug_id
LEFT JOIN manufacturers m ON dm.manufacturer_id = m.id
WHERE dr.period_code LIKE '%72411 IM%'

它返回:

有趣的是,ID:412790和period_code:72411 IM 信息是表中的一条记录。因此,它被多次退回。多次返回的数据太多。我也尝试了以下查询,但它也返回了错误的数据:

SELECT dr.id, dm.counter, dr.period_code, dr.drug_id, d.name, m.name FROM drug_reports dr
LEFT JOIN drugs d ON dr.drug_id = d.id
LEFT JOIN drug_manufacturers dm ON d.id = dm.drug_id
LEFT JOIN manufacturers m ON dm.manufacturer_id = m.id AND dr.mf_id = dm.manufacturer_id
WHERE dr.period_code LIKE '%72411 IM%'

我需要以下结果:
| dr.id | 周期码|姓名|计数器|制造商|
| --------------|--------------|--------------|--------------|--------------|
| 412790|小行星72411| ДИГОКСИН ТАБЛ。0,25 МГ №40| 5| ARPIMED|
如何写一个正确的查询?有人能有主意吗?

ymdaylpp

ymdaylpp1#

下面的查询显示了多对多连接过程中中间链接表中的所有数据。那是

SELECT dr.id, dm.counter, dr.period_code, dr.drug_id, d.name, m.name FROM drug_reports dr
LEFT JOIN drugs d ON dr.drug_id = d.id
LEFT JOIN drug_manufacturers dm ON d.id = dm.drug_id
LEFT JOIN manufacturers m ON dm.manufacturer_id = m.id
WHERE dr.period_code LIKE '%72411 IM%'

所以,我写了以下查询:

SELECT 
 dr.id,
 (SELECT dm.counter FROM drug_manufacturers dm WHERE dm.drug_id = dr.drug_id AND dm.manufacturer_id = dr.mf_id LIMIT 1 ) as COUNTER
 dr.period_code,
 dr.drug_id,
 d.name,
 m.name 
FROM drug_reports dr
LEFT JOIN drugs d ON dr.drug_id = d.id
LEFT JOIN manufacturers m ON dm.manufacturer_id = m.id
WHERE dr.period_code LIKE '%72411 IM%'

返回我想要的结果。结果没有任何重复记录。谢谢大家!

相关问题