代码之家  ›  专栏  ›  技术社区  ›  sebastian nielsen

删除单数条目

  •  1
  • sebastian nielsen  · 技术社区  · 14 年前

    如果我有这张桌子:

    +------+-------+---------------+--------+-----------------+------------+-----------+----------------+------+------+--------+------------+------------+
    | 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”。

    我试过: 从lan中删除COUNT(userip)=1;

    明白了: 错误1111(HY000):组函数的使用无效

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

    换句话说,如果IP在一行中是唯一的,则删除它。

    2 回复  |  直到 9 年前
        1
  •  2
  •   OMG Ponies    14 年前

    用途:

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

    出现错误的原因是无法在中使用COUNT或任何其他聚合函数 WHERE HAVING 子句可以这样引用聚合函数。

    这可能有用:

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

    警告

    ROLLBACK 如有必要。

        2
  •  1
  •   Bill Karwin    14 年前

    我会这样做:

    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 使用外部联接。如果找不到匹配项,则 将全部为空。如果发生这种情况,请删除 l1级