Удалить отдельные записи - PullRequest
1 голос
/ 15 сентября 2010

Если у меня есть эта таблица:

+------+-------+---------------+--------+-----------------+------------+-----------+----------------+------+------+--------+------------+------------+
| 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" И у пользователя "sebastian" с IP "123.123.123.126" нет "спутников", нет других пользователей с тем же IP.

У пользователя "sebbetest" есть компаньон "stackowerflow".

У пользователя "tester" есть 2 спутника: "admin" и "username".

Теперь я хочу удалить этих пользователей, у которых нет компаньонов. Как я сделаю? По атомарным причинам и для предотвращения одновременного доступа к базе данных, я хотел бы удалить всех «не сопутствующих» пользователей в одном выражении SQL.

Я пробовал с: УДАЛИТЬ ИЗ ЛАН, ГДЕ СЧЕТ (userip) = 1;

получил это: ОШИБКА 1111 (HY000): неверное использование групповой функции

Строки не являются дубликатами. Если необходимо проверить, является ли запись уникальной независимо от IP, (тип, идентификатор пользователя) уникальны.

Другими словами, если IP является уникальным в строке, удалите его.

Ответы [ 2 ]

2 голосов
/ 15 сентября 2010

Использование:

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;

Внимание

С каждым оператором DELETE проверяйте и дважды проверяйте, чтобы оператор выбрал то, что вы хотите удалить. Если вы используете таблицы InnoDB, оберните DELETE в транзакции, чтобы при необходимости вы могли использовать ROLLBACK.

1 голос
/ 15 сентября 2010

Я бы сделал это следующим образом:

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.

...