2010-09-21 8 views
0

Avant de plonger dans la question, je vais d'abord expliquer la situation. J'ai deux tables telles que les suivantes:MySQL résultats retour d'une table à partir des données dans une autre table

USERS TABLE 
user_id 
username 
firstName 
lastName 

GROUPS TABLE 
user_id 
group_id 

Je veux récupérer tous les utilisateurs qui PRÉNOM est LIKE « % foo% » et qui fait partie d'un groupe avec group_id = « givengid »

Ainsi, la requête voudrait quelque chose comme ceci:

SELECT user_id FROM users WHERE firstName LIKE '%foo'" 

je peux faire une fonction SQL définie par l'utilisateur tels que ismember (user_id, group_id) qui renverra 1 si l'utilisateur est une partie du groupe et 0 si elles ne sont pas et ceci à la clause WHERE dans l'instruction select précitée. Toutefois, cela signifie que pour chaque utilisateur dont le prénom correspond aux critères, une autre requête doit être exécutée à travers des milliers d'autres enregistrements pour trouver une correspondance potentielle pour une entrée de groupe.

Le tableau des utilisateurs et des groupes auront chacun plusieurs centaines de milliers de dossiers. Est-il plus classique d'utiliser l'approche de fonction définie par l'utilisateur ou d'exécuter une requête à l'aide de l'instruction UNION? Si l'approche UNION est la meilleure, à quoi ressemblerait la requête avec la déclaration du syndicat?

Bien sûr, je vais courir des repères mais je veux juste obtenir une certaine perspective sur la gamme possible de solutions pour cette situation et ce qui est généralement le plus efficace/efficace.

Répondre

3

Vous devez utiliser un JOIN pour obtenir les utilisateurs correspondant à vos deux critères.

SELECT 
    user_id 
FROM 
    users 
INNER JOIN 
    groups 
    ON groups.user_id = users.users_id 
    AND groups.group_id = given_id 
WHERE 
    firstName LIKE '%foo' 
+0

Curieux, quelle est la différence entre INNER JOIN et simplement JOIN? – user396404

+0

Il n'y a pas de différence, JOIN est un sucre syntaxique pour INNER JOIN. –

1

Vous n'avez pas besoin d'utiliser soit un UNION ou une fonction définie par l'utilisateur ici; à la place, vous pouvez utiliser un JOIN (qui vous permet de joindre une table à un autre basé sur un ensemble de colonnes équivalentes):

SELECT u.user_id 
FROM users AS u 
JOIN groups AS g 
    ON g.user_id = u.user_id 
WHERE g.group_id = 'givengid' 
    AND u.firstName LIKE '%foo' 

Qu'est-ce que cette requête ne se joindre à des lignes dans la table groups aux lignes dans la users table lorsque la user_id est le même (donc si vous deviez utiliser SELECT *, vous finissez avec une longue ligne contenant les données utilisateur et les données de groupe pour cet utilisateur). Si plusieurs lignes groups existent pour l'utilisateur, plusieurs lignes seront récupérées avant d'être filtrées par la clause WHERE.

1

Utilisez un JOIN:

SELECT DISTINCT user_id 
FROM users 
INNER JOIN groups ON groups.user_id = users.user_id 
WHERE users.firstName LIKE '%foo' 
AND groups.group_id = '23' 

Le DISTINCT fait que vous ne disposez pas d'ID d'utilisateur en double dans le résultat.

Questions connexes