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”有 2 个同伴:“admin”和“username”。

现在我想删除这些缺少同伴的用户。我怎样做?出于原子原因和防止并发访问修改数据库,我想在单个 SQL 表达式中删除所有“非伴随”用户。

我尝试过: DELETE FROM 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 表,请将 DELETE 包装在事务中,以便ROLLBACK在必要时使用。

于 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则将全部为空。发生这种情况的地方,删除l1.

于 2010-09-14T23:55:52.180 回答