2009-06-18 5 views
2

J'ai une table comme celui-ci (MySQL 5.0.x, MyISAM):De nouveaux enregistrements avec des données communes

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

Je voudrais trouver tous les utilisateurs non interdits (banned=0) si au moins 5 autres utilisateurs avec le la même ip a déjà été bannie (banned=1).

Merci pour votre aide! :)

Répondre

4

Si vous avez beaucoup d'utilisateurs interdits:

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 

Si vous avez quelques utilisateurs interdits:

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

Dans les deux cas, ayant un indice sur (ip, banned) permettra d'améliorer ces requêtes beaucoup .

+0

Exactement ce que je cherchais: Je voulais éviter le "SELECT ... IN()" pour les problèmes de performance. Merci beaucoup. :) – Toto

1
SELECT id 
FROM user 
WHERE ip IN (
SELECT DISTINCT ip 
FROM user 
WHERE COUNT(*) >= 5 
    AND banned = 1 
GROUP BY ip 
) 
AND banned = 0 
Questions connexes