Новые записи с общими данными - PullRequest
2 голосов
/ 18 июня 2009

У меня есть такая таблица (MySQL 5.0.x, MyISAM):

user{id, login, ip, banned} (Banned: 0 false, 1 true)

Я бы хотел, чтобы все пользователи не были забанены (banned=0), если хотя бы 5 других пользователей с таким же ip уже были забанены (banned=1).

Спасибо за вашу помощь! :)

Ответы [ 2 ]

4 голосов
/ 18 июня 2009

Если у вас много заблокированных пользователей:

SELECT  *
FROM    user uo
WHERE   EXISTS (
        SELECT  1
        FROM    user ui
        WHERE   ui.ip = uo.ip
                AND banned = 1
        LIMIT 4, 1
        )
        AND banned = 0

Если у вас мало заблокированных пользователей:

SELECT  *
FROM    user
WHERE   ip IN (
        SELECT  ip
        FROM    user
        WHERE   banned = 1
        GROUP BY
                ip
        HAVING  COUNT(*) >= 5
        )
        AND banned = 0

В обоих случаях наличие индекса на (ip, banned) значительно улучшит эти запросы.

1 голос
/ 18 июня 2009
SELECT id
FROM user
WHERE ip IN (
 SELECT DISTINCT ip
 FROM user
 WHERE COUNT(*) >= 5
  AND banned = 1
 GROUP BY ip
)
 AND banned = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...