7

sesskey (varchar32 , index) と products (int11) の 2 つのフィールドでタグ付けされたテーブルがあり、sesskey count(*) = 1 でグループ化されたすべての行を削除する必要があります。いくつかの方法を試していますが、すべて失敗します。

例:

delete from taged where sesskey in (select sesskey from taged group by sesskey having count(*) = 1)

sesskey フィールドは繰り返されているため、主キーにできませんでした。

4

3 に答える 3

9
DELETE  si
FROM    t_session si
JOIN    (
        SELECT  sesskey
        FROM    t_session so
        GROUP BY
                sesskey
        HAVING  COUNT(*) = 1
        ) q
ON      q.sesskey = si.sesskey

ここに参加する必要があります。相関サブクエリを使用しても機能しません。

詳細については、私のブログのこの記事を参照してください。

于 2009-12-14T17:06:52.433 に答える
1

サブクエリは機能するはずです

 Delete from taged 
  Where sesskey in 
     (Select sesskey 
      From taged 
      Group by sesskey 
      Having count(*) = 1)

編集: 以下の @Quassnoi コメントのおかげで... 上記はMySql では機能しません.

于 2009-12-14T16:50:28.847 に答える
1

または、古い (4.1 より前の) バージョンの MySQL を使用していて、サブクエリにアクセスできない場合は、データをテーブルに選択してから、そのテーブルを元のテーブルに結合する必要があります。

CREATE TABLE delete_me_table (sesskey varchar32, cur_total int);

INSERT INTO delete_me_table SELECT sesskey, count(*) as cur_total FROM orig_table
WHERE cur_total = 1 GROUP BY sesskey;

DELETE FROM orig_table INNER JOIN delete_me_table USING (sesskey);

delete_me_tableこれで、削除したすべての行の履歴を含む名前付きのテーブルが残っています。これは、アーカイブ、トレンド、その他の楽しく珍しいものに使用して、自分を驚かせることができます。

于 2009-12-14T17:04:01.223 に答える