1

私がこのテーブルを持っている場合:

+------+-------+---------------+--------+-----------------+------------+-----------+----------------+------+------+--------+------------+------------+
| type | class | username      | userid | userip          | usermobile | useremail | daysleft| pin1 | pin2 | pin3 | active | schoolname | schoolsite |
+------+-------+---------------+--------+-----------------+------------+-----------+----------------+------+------+--------+------------+------------+
| B    | A     | sebbetest     |   1000 | 123.123.123.123 | none       | none      |       50| 0    | 0    | 0    | Y      | none       | none       | 
| A    | A     | stackowerflow |   5355 | 123.123.123.123 | none       | none      |       50| 0    | 0    | 0    | Y      | none       | haha       | 
| C    | A     | good          |   4223 | 123.123.123.124 | none       | none      |       50| 0    | 0    | 0    | Y      | none       | haha       | 
| A    | A     | tester        |   6353 | 123.123.123.125 | none       | none      |       50| 0    | 0    | 0    | Y      | none       | haha       | 
| B    | A     | admin         |   3453 | 123.123.123.125 | none       | none      |       50| 0    | 0    | 0    | Y      | none       | eeee       | 
| A    | A     | sebastian     |   1342 | 123.123.123.126 | none       | none      |       50| 0    | 0    | 0    | Y      | none       | eeee       | 
| C    | A     | username      |   6456 | 123.123.123.125 | none       | none      |       50| 0    | 0    | 0    | Y      | none       | woooooow   | 
+------+-------+---------------+--------+-----------------+------------+-----------+----------------+------+------+--------+------------+------------+

ご覧のとおり、IP「123.123.123.124」のユーザー「good」とIP「123.123.123.126」のユーザー「sebastian」には「コンパニオン」がなく、同じIP上の他のユーザーもいません。

ユーザー「sebbetest」には、コンパニオン「stackowerflow」があります。

ユーザー「tester」には、「admin」と「username」の2つのコンパニオンがあります。

ここで、コンパニオンが不足しているこれらのユーザーを削除したいと思います。どうすればいいですか?アトミックな理由と、同時アクセスによるデータベースの変更を防ぐために、SQLの単一の式ですべての「非コンパニオン」ユーザーを削除したいと思います。

私は次のように試しました:DELETE FROM lan WHERE COUNT(userip)= 1;

これを取得しました:エラー1111(HY000):グループ関数の使用が無効です

重複する行はありません。IPに関係なくエントリが一意であるかどうかを確認する必要がある場合、(タイプ、ユーザーID)は一意です。

つまり、IPが連続して一意である場合は、それを削除します。

4

2 に答える 2

2

使用する:

DELETE FROM lan
 WHERE userip IN (SELECT x.userip
                   FROM (SELECT yt.userip
                           FROM lan yt
                       GROUP BY yt.userip
                         HAVING COUNT(*) = 1) x )

WHEREサブクエリの外部では、句内でCOUNTまたはその他の集計関数を使用できないため、エラーが発生します。句内でのみ、HAVINGその方法で集計関数を参照できます。

これが機能する可能性があります。

  DELETE FROM lan 
GROUP BY userip
  HAVING COUNT(*) = 1;

警告

すべてのDELETEステートメントで、ステートメントが削除する対象を選択することを確認し、再確認します。InnoDBテーブルを使用している場合はROLLBACK、必要に応じて使用できるように、DELETEをトランザクションでラップします。

于 2010-09-14T23:51:02.207 に答える
1

私はそれをこのようにします:

DELETE l1
FROM lan l1 LEFT OUTER JOIN lan l2 
  ON l1.userip = l2.userip AND l1.username <> l2.username
WHERE l2.userid IS NULL

つまり、外部結合を使用して、l1そのコンパニオンと一致させてください。l2一致するものが見つからない場合は、l2すべてnullになります。その場合は、を削除してくださいl1

于 2010-09-14T23:55:52.180 に答える