2010-04-28 7 views
3

Je suis relativement nouveau dans mysql et je ne sais pas si je me dirige dans la bonne direction, mais j'ai des problèmes avec une requête mysql.Problème lors de l'utilisation de mysql joins

J'ai essentiellement une table des utilisateurs

id  name 
---- -------- 
1  user1   
2  user2   
3  user3   
4  user4 

ainsi qu'une table d'attributs de l'utilisateur

id  userid attribute 
---- ----- ------ 
1  1  5   
2  1  6  
3  2  5   
4  3  4 

Je veux être en mesure de choisir les utilisateurs qui ont à la fois l'attribut 5 et l'attribut 6, donc dans ce cas je veux retourner

id  name 
---- -------- 
1  user1 

J'ai essayé d'utiliser une jointure comme ceci.

SELECT u.id, u.name FROM users u LEFT JOIN attributes a ON (a.userid = u.id) WHERE a.attribute = 5 AND a.attribute = 6 

Mais évidemment, cela ne fonctionnera pas, quelle est la meilleure façon de faire cela?

Répondre

0
SELECT u.id, u.name FROM users u 
    INNER JOIN attributes a1 ON u.id = a1.userid 
    INNER JOIN attributes a2 ON u.id = a2.userid 
WHERE a1.attribute = 5 AND a2.attribute = 6 
4

Une façon de le faire serait d'utiliser deux jointures; par exemple:

SELECT ... 
FROM users u 
    JOIN attributes a5 ON u.id = a5.userid AND a5.attribute = 5 
    JOIN attributes a6 ON u.id = a6.userid AND a6.attribute = 6 

Une autre façon est en groupant (notez que je suis une personne MS SQL, pas sûr si cela est la bonne syntaxe pour MySQL ou non):

SELECT u.id, u.name 
FROM users u 
    JOIN attributes a ON u.id = a.userid 
WHERE a.attribute IN (5,6) 
GROUP BY u.id, u.name 
HAVING COUNT(*) = 2 
+0

Très agréable. J'aime la solution de regroupement. J'étais sûr qu'il devait y avoir un meilleur moyen que d'avoir une jointure pour chaque attribut requis. – Zarigani

0

Modification de la requête comme ceci fonctionnerait:

Sélectionnez tout à partir du tableau d'attributs égal à 5 ​​ou 6, puis vérifiez les utilisateurs qui correspondent.

SELECT a.id, u.name 
FROM attributes AS a 
LEFT JOIN users AS u ON a.id = u.id 
WHERE a.attribute = 5 OR a.attribute = 6 
+1

@Frankie: drôle comment tout le monde sauf vous n'avez pas remarqué une telle erreur simple :) –

+0

@Alexander: Je suppose que la question est très penchée vers la table 'utilisateurs' et les gens commencent à y penser dès la première requête. Merci pour le commentaire! – Frankie

0

Sur la base de votre question, je ne pense pas que les deux autres réponses actuelles sont satisfaisantes.

Si vous voulez:

sélectionner les utilisateurs qui ont à la fois l'attribut 5 et l'attribut 6

La requête suivante est une façon d'y parvenir:

select 
    * 
from 
    users 
where 
    id in (select userid from attributes where attribute = 5) 
    and 
    id in (select userid from attributes where attribute = 6)