如果我有这张桌子:
+------+-------+---------------+--------+-----------------+------------+-----------+----------------+------+------+--------+------------+------------+
| 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在一行中是唯一的,请将其删除。
答案 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
。