MySQL以多个ON条件连接到同一个表?
我还是一个mysql新手,我仔细研究了前面的问题,试图找到一个合适的解决方案 我有两个表CaseReportsTempPort2011Q3和FDADrugsDB,我想做一个左联接以将CaseReportsTempPort2011Q3.drugname与FDADrugsDB.ReferenceDrugName和FDADrugsDB.drugname匹配 我所设想的是:MySQL以多个ON条件连接到同一个表?,mysql,join,conditional-statements,Mysql,Join,Conditional Statements,我还是一个mysql新手,我仔细研究了前面的问题,试图找到一个合适的解决方案 我有两个表CaseReportsTempPort2011Q3和FDADrugsDB,我想做一个左联接以将CaseReportsTempPort2011Q3.drugname与FDADrugsDB.ReferenceDrugName和FDADrugsDB.drugname匹配 我所设想的是: SELECT DISTINCT(CaseReportsTempImport2011Q3.DRUGNAME) , FDADrugsD
SELECT DISTINCT(CaseReportsTempImport2011Q3.DRUGNAME)
, FDADrugsDB_Product.drugname
, FDADrugsDB_Product.ReferenceDrug
, FDADrugsDB_Product.activeingred
FROM CaseReportsTempImport2011Q3
LEFT JOIN FDADrugsDB_Product ON CaseReportsTempImport2011Q3.DRUGNAME LIKE TRIM(FDADrugsDB_Product.ReferenceDrug)
LEFT JOIN FDADrugsDB_Product ON CaseReportsTempImport2011Q3.DRUGNAME LIKE TRIM(FDADrugsDB_Product.DrugName)
ORDER BY LENGTH(CaseReportsTempImport2011Q3.DRUGNAME) ASC
但这不起作用,我得到“非唯一表/别名:”FDADrugsDB_产品-有帮助吗
谢谢
编辑以获得更好的解决方案请求/重新措辞
然而,根据borealids的说法,我不确定这是否是您想要做的——将表连接两次将产生乘法结果。我想你可能想加入一个关于。。。或…,使连接条件成为链接的两个原因中的或
...
FROM
CaseReportsTempImport2011Q3 i
LEFT JOIN FDADrugsDB_Product p ON i.DRUGNAME LIKE TRIM(p.ReferenceDrug)
OR i.DRUGNAME LIKE TRIM(p.DrugName)
ORDER BY
LENGTH(i.DRUGNAME) ASC
我想知道怎么做
解决方案
在病例报告StempImport2011Q3.DRUGNAME(如TRIMFDADrugsDB_Product.ReferenceDrug)或病例报告StempImport2011Q3.DRUGNAME(如TRIMFDADrugsDB_Product.DRUGNAME)中
感谢tom和borealid。要使您编写的查询有效,您需要为同一个表的两个用途分配两个不同的关系名
LEFT JOIN FDADrugsDB_Product FDA_first ON
及
然后使用FDA_first和FDA_second这两个名称来明确表示每组的结果。否则,当您说FDADrugsDB_Product时,查询引擎无法告诉您的意思-它们有两个,每个都不同
然而,我不确定这是否是您想要做的-将表连接两次将产生乘法结果。我想你可能想加入一个关于。。。或者…,使连接条件成为链接的两个原因中的一个或。要使您编写的查询有效,您需要为同一表的两个用途分配两个不同的关系名称
LEFT JOIN FDADrugsDB_Product FDA_first ON
...
FROM
CaseReportsTempImport2011Q3 i
LEFT JOIN FDADrugsDB_Product p ON i.DRUGNAME LIKE TRIM(p.ReferenceDrug)
OR i.DRUGNAME LIKE TRIM(p.DrugName)
ORDER BY
LENGTH(i.DRUGNAME) ASC
及
然后使用FDA_first和FDA_second这两个名称来明确表示每组的结果。否则,当您说FDADrugsDB_Product时,查询引擎无法告诉您的意思-它们有两个,每个都不同
然而,我不确定这是否是您想要做的-将表连接两次将产生乘法结果。我想你可能想加入一个关于。。。或…,使连接条件成为链接的两个原因中的或
...
FROM
CaseReportsTempImport2011Q3 i
LEFT JOIN FDADrugsDB_Product p ON i.DRUGNAME LIKE TRIM(p.ReferenceDrug)
OR i.DRUGNAME LIKE TRIM(p.DrugName)
ORDER BY
LENGTH(i.DRUGNAME) ASC
注意,除非ReferenceDrug和DrugName包含匹配模式,否则可能应该使用=而不是LIKE
请注意,除非ReferenceDrug和DrugName包含匹配模式,否则您可能应该使用=而不是LIKE。您需要为表指定别名,否则MySql将不知道您正在谈论的FDADrugsDB表的哪个实例。i、 e
FROM CaseReportsTempImport2011Q3 a
LEFT JOIN FDADrugsDB_Product b ON CaseReportsTempImport2011Q3.DRUGNAME LIKE TRIM(FDADrugsDB_Product.ReferenceDrug)
LEFT JOIN FDADrugsDB_Product c ON CaseReportsTempImport2011Q3.DRUGNAME LIKE TRIM(FDADrugsDB_Product.DrugName)
您需要为表指定别名,否则MySql将不知道您正在谈论的FDADrugsDB表的哪个实例。i、 e
FROM CaseReportsTempImport2011Q3 a
LEFT JOIN FDADrugsDB_Product b ON CaseReportsTempImport2011Q3.DRUGNAME LIKE TRIM(FDADrugsDB_Product.ReferenceDrug)
LEFT JOIN FDADrugsDB_Product c ON CaseReportsTempImport2011Q3.DRUGNAME LIKE TRIM(FDADrugsDB_Product.DrugName)
只需在foo.fk=bar.id和foo.name=bar.name上使用和/或与WHERE-like-JOIN-foo-ON-foo.fk=bar.id和foo.name=bar.name一样使用和/或删除表中的第二个连接或别名,尽管这似乎没有意义。只需使用和/或与WHERE-like-JOIN-foo-ON-foo-ON-foo.fk=bar.id和foo.name=bar.name一样,并删除表中的第二个连接或别名无意义你忘了在LIKE中使用别名。谢谢。我只是举了一个简单的例子,并没有检查整个语法。我这方面的错误做法会导致混乱:-是的,我不是挑剔,只是担心他们会尝试运行您的查询并收到相同的错误消息。您忘了使用类似的别名。谢谢。我只是举了一个简单的例子,并没有检查整个语法。我这方面的错误做法会导致混乱:-是的,我不是挑剔,只是担心他们会尝试运行您的查询并得到相同的错误消息。是的,我很想知道如何进行on或for one join,我试过了,但我的语法非常新且生疏。我该怎么做?@cerd:ON CaseReportsTempImport2011Q3.DRUGNAME如TRIMFDADrugsDB_Product.ReferenceDrug或CaseReportsTempPort2011Q3.DRUGNAME如TRIMFDADrugsDB_Product.DRUGNAME。这和做两个连接不同。是的,我很想弄清楚如何做一个ON或for-one连接,我试过了,但我的语法很新,很生疏。我该怎么做?@cerd:ON CaseReportsTempImport2011Q3.DRUGNAME如TRIMFDADrugsDB_Product.ReferenceDrug或CaseReportsTempPort2011Q3.DRUGNAME如TRIMFDADrugsDB_Product.DRUGNAME。这与执行两个连接不同。是的,数据非常脏,因此必须使用LIKE,甚至可能是一些REGEXP。@cerd是的,但在您的条件中不包括%的地方,LIKE的行为类似=。无论如何,如果这是你需要的,没关系。是的,数据很脏,所以必须使用LIKE,甚至一些REGEXP。@cerd是的,但是在你的条件中不包括%的地方,LIKE的行为像=。不管怎样,如果这是你需要的,没关系。