繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM