MySQL根据另一个表中的数据从一个表返回结果

时间:2010-09-21 13:09:03

标签: mysql select union user-defined-functions

在深入研究这个问题之前,我首先要解释一下这个情况。我有两个表,如下所示:

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),如果用户是组的一部分,则返回1,如果不是,则返回0,这与前面提到的select语句中的WHERE子句相同。但是,这意味着对于名字与标准匹配的每个用户,必须通过数千条其他记录运行另一个查询才能找到组条目的潜在匹配。

用户和组表每个都有几十万条记录。使用用户定义的函数方法或使用UNION语句运行查询更常规吗?如果UNION方法最好,那么使用union语句的查询会是什么样的?

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

3 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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'

当user_id相同时,此查询的作用是将groups表中的行连接到users表中的行(因此,如果您使用SELECT *,则会结束包含用户数据和该用户的组数据的长行。如果用户存在多个groups行,则在被WHERE子句过滤之前将检索多行。

答案 2 :(得分:1)

使用联接:

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。