2010-09-21 121 views
0

在深入研究这个问题之前,首先我将解释这种情况。我有两个表,如下所示:MySQL根据另一个表中的数据从一个表中返回结果

USERS TABLE 
user_id 
username 
firstName 
lastName 

GROUPS TABLE 
user_id 
group_id 

我想找回谁的名字的所有用户是LIKE“%FOO%”,谁是GROUP_ID一组的一部分=“givengid”

因此,查询想是这样的:

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

我可以做一个用户定义的SQL函数,如ismember(USER_ID,GROUP_ID)如果用户是该组的一部分,0,如果他们将返回1不在上述select语句中的WHERE子句中。但是,这意味着对于名字与标准匹配的每个用户而言,必须通过其他数千个其他记录运行另一个查询才能找到潜在的匹配条目。

用户和组表将分别有几十万条记录。使用用户定义的函数方法还是使用UNION语句运行查询更传统?如果UNION方法最好,那么带有union声明的查询将是什么样子?

当然,我会运行基准测试,但我只想对这种情况的解决方案的可能范围以及通常最有效/最有效的解决方案有所了解。

回答

3

您应该使用JOIN来获得符合您的两个条件的用户。

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

好奇,INNER JOIN和just JOIN有什么区别? – user396404 2010-09-21 13:48:16

+0

没有区别,JOIN是INNER JOIN的语法糖。 – 2010-09-21 15:18:45

1

您不需要在这里使用UNION或用户定义的函数;相反,你可以使用一个JOIN(它可以让你加入一个表基于一组等同列的另一个):

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' 

什么这个查询请求也就是凑groups表行于行users表,当user_id是相同的(所以如果你要使用SELECT *,你最终会得到一个包含该用户的用户数据和组数据的长行)。如果用户存在多行groups行,则会在检索WHERE子句之前检索多行。

1

使用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' 

DISTINCT确保你没有用户ID重复的结果。

相关问题