2017-09-15 170 views
-1

我有以下查询,但它会删除所有行“info”而不是只删除重复的行。我究竟做错了什么?删除重复的行mysql

$db->setQuery("DELETE t1 FROM #__rsform_submission_values t1 
       INNER JOIN #__rsform_submission_values t2 
       WHERE t1.SubmissionValueId > t2.SubmissionValueId AND t1.FieldName = 'info' AND t1.SubmissionId = '".$subId."'"); 
$db->query(); 
$query = $db->getQuery(true); 
+1

这是如何运行的,你的内部连接中没有ON语句? – Magisch

+0

你确定你在使用MySQL吗?它不使用以'#'开头的表名。 – Barmar

+0

@Magisch据我所知,不带'ON'的INNER JOIN'与至少在某些RDBMS中只写'''而不是'INNER JOIN'相同。换句话说,我认为这只是两张表的交叉产物。 – Binarus

回答

0

假设该查询以某种方式工作,你告诉它删除任何行(名为“信息”和一些提交值id),为它找到具有SubmissionValueId是较低的另一行。

您需要考虑一对行的重复意味着什么。例如。如果他们有相同的FieldName。建议:加上AND t2.FieldName = 'info',如果这就是你的意思。

似乎还有更多关于此查询的改进,但我会从它的本质入手。

0

您似乎错过了JOIN条件。我猜测:

DELETE rsv 
    FROM #__rsform_submission_values rsv INNER JOIN 
     #__rsform_submission_values rsv2 
     ON rsv2.SubmissionId = rsv.SubmissionId AND 
      rsv2.FieldName = rsv.FieldName 
    WHERE rsv.SubmissionValueId > rsv2.SubmissionValueId AND 
      rsv.FieldName = 'info' AND rs1.SubmissionId = ?; 

您应该学会使用参数化查询,而不是查询字符串。这就是为什么我用?替换了id值。