2017-09-15 191 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值。