【问题标题】:MySQL returning results from one table based on data in another tableMySQL 根据另一个表中的数据从一个表返回结果
【发布时间】:2011-04-15 04:54:44
【问题描述】:

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

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 子句。但是,这意味着对于每个名字与条件匹配的用户,必须对数千条其他记录运行另一个查询才能找到与组条目的潜在匹配项。

users 和 groups 表每个都有几十万条记录。使用用户定义的函数方法或使用 UNION 语句运行查询是否更传统?如果 UNION 方法最好,带有 union 语句的查询会是什么样子?

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

【问题讨论】:

    标签: mysql select union user-defined-functions


    【解决方案1】:

    您应该使用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'
    

    【讨论】:

    • 好奇,INNER JOIN和just JOIN有什么区别?
    • 没有区别,JOIN是INNER JOIN的语法糖。
    【解决方案2】:

    您不需要在这里使用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 子句过滤之前检索多个行。

    【讨论】:

      【解决方案3】:

      使用连接:

      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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-30
        • 1970-01-01
        相关资源
        最近更新 更多