11
votes

MySQL Beaucoup de problèmes de requête à plusieurs

Voici mon problème. J'ai une table plusieurs à plusieurs appelée "user_has_personalities". Dans ma demande, les utilisateurs peuvent avoir de nombreuses personnalités et une personnalité peut appartenir à de nombreux utilisateurs.

La table a deux colonnes entier, user_id et personnalité_id.

Ce que je dois faire, c'est obtenir tous les utilisateurs qui ont au moins toutes les personnalités (un ensemble de personnalités de la taille variable) que je fournis à la requête.

Pour un exemple, j'aimerais obtenir tous les utilisateurs possédant des personnalités avec IDS 4, 5, 7, mais peuvent également avoir d'autres personnalités. Mais j'ai besoin de la requête pour travailler pour un nombre variable d'identifiants de personnalité recherchés, comme 4, 5, 7, 9, 10 pour un exemple.

Des idées?


0 commentaires

3 Réponses :


6
votes

Cette requête fait le travail:

select  user_id
from    user_has_personalities
where   personality_id in (4,5,7)
group by user_id
having count(*) = 3


4 commentaires

Cela dit simplement s'ils ont l'un des personnalités_ids. La question dit explicitement tous les identifiants.


@Évan: cette requête indique si l'utilisateur dispose de tous les identifiants.


Je vois ce que tu fais. Joli.


C'est le moyen le plus rapide et le plus élégant de le faire! Super!!



4
votes
SELECT  user_id
FROM    users uhpo
WHERE   (
        SELECT  COUNT(*)
        FROM    perslist p
        JOIN    user_has_personalities uhpi
        ON      uhpi.user_id = uhpo.user_id
                AND uhpi.personality_id = p.id
        ) =
        (
        SELECT  COUNT(*)
        FROM    perslist
        )

2 commentaires

+1 pour la maîtrise générale et l'assistant-Ness :) Quassnoi, j'aime votre blog et je vous ai lié. J'aimerais encore plus que votre blog si vous ouvriez des commentaires, mais il est évident que votre prérogative de le laisser tel quel. Quoi qu'il en soit, acclamez et continuez-le :)


@Roland: Tous les articles de la catégorie Divers a activé des commentaires activés.



1
votes
SELECT a.user_id
FROM user_has_personalities a
JOIN user_has_personalities b ON a.user_id = b.user_id AND b.personality_id = 5
JOIN user_has_personalities c ON a.user_id = c.user_id AND b.personality_id = 7
WHERE a.personality_id = 4
It would be easy enough to generate this list programatically, but it's not exactly as easy as supplying a set.  On the other hand, it is efficient.

0 commentaires