Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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以多个ON条件连接到同一个表?_Mysql_Join_Conditional Statements - Fatal编程技术网

MySQL以多个ON条件连接到同一个表?

MySQL以多个ON条件连接到同一个表?,mysql,join,conditional-statements,Mysql,Join,Conditional Statements,我还是一个mysql新手,我仔细研究了前面的问题,试图找到一个合适的解决方案 我有两个表CaseReportsTempPort2011Q3和FDADrugsDB,我想做一个左联接以将CaseReportsTempPort2011Q3.drugname与FDADrugsDB.ReferenceDrugName和FDADrugsDB.drugname匹配 我所设想的是: SELECT DISTINCT(CaseReportsTempImport2011Q3.DRUGNAME) , FDADrugsD

我还是一个mysql新手,我仔细研究了前面的问题,试图找到一个合适的解决方案

我有两个表CaseReportsTempPort2011Q3和FDADrugsDB,我想做一个左联接以将CaseReportsTempPort2011Q3.drugname与FDADrugsDB.ReferenceDrugName和FDADrugsDB.drugname匹配

我所设想的是:

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的行为像=。不管怎样,如果这是你需要的,没关系。