2017-09-15 14 views
-1

私は以下のクエリを持っていますが、重複するものだけを削除するのではなく、すべての行 "情報"を削除します。何が間違っているのですか?このクエリは何とか働いている想定重複する行を削除する

$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私が知る限り、 'INNER JOIN'を' ON 'にすることは、少なくともいくつかのRDBMSでは 'INNER JOIN'の代わりに'、 'を書くことと同じです。言い換えれば、私はこれがちょうど2つのテーブルのクロス積であると仮定します。 – Binarus

答えて

0

、あなたはそれが低いSubmissionValueIdを持つ別の行を見つけることができたために(名前「情報」といくつかの提出値idで)任意の行を削除するよう指示。

2つの行が重複しているとは何を意味するのか考える必要があります。例えば。それらが同じである場合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値を?に置き換えたのです。