[英]MySQL returning results from one table depend on existence of data in another table (master category)
[英]MySQL returning results from one table based on data in another table
在深入探讨问题之前,我将首先说明情况。 我有两个表,如下所示:
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语句的查询将是什么样?
当然,我将运行基准测试,但是我只想对这种情况下可能的解决方案范围以及通常最有效/最有效的方法有一些看法。
您应该使用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'
您无需在此处使用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
子句过滤之前检索多个行。
使用联接:
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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.