删除单数条目

时间:2010-09-14 23:43:31

标签: mysql sql sql-delete mysql-error-1111

如果我有这张桌子:

+------+-------+---------------+--------+-----------------+------------+-----------+----------------+------+------+--------+------------+------------+
| 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”的用户“好”和IP“123.123.123.126”的用户“sebastian”没有“同伴”,同一IP上没有其他用户。

用户“sebbetest”有一个伴侣“stackowerflow”。

用户“测试人员”有两个随播广告:“admin”和“username”。

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

我尝试过: 从LAN WHERE COUNT(userip)= 1;

删除

得到了这个: ERROR 1111(HY000):无效使用组功能

没有行是重复的。 如果需要检查条目是否是唯一的而不管IP,(type,userid)是唯一的。

换句话说,如果IP在一行中是唯一的,请将其删除。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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