在深入研究这个问题之前,我首先要解释一下这个情况。我有两个表,如下所示:
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语句的查询会是什么样的?
当然,我会运行基准测试,但我只想了解一下这种情况可能的解决方案范围,以及通常最有效/最有效的解决方案。
答案 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。