【问题标题】:Better MySQL query?更好的 MySQL 查询?
【发布时间】:2015-02-03 06:36:27
【问题描述】:

这是一个示例,我有一个 Car、User、Member 和 Dealer 表。目前我正在尝试通过匹配他们的用户 ID 来获取拥有汽车的经销商的名称

Select userid, name FROM `User` WHERE userid IN 
    (SELECT userid FROM 'Car' WHERE userid in 
        (SELECT userid FROM `Member` WHERE userid IN 
             (SELECT userid FROM `Dealer`)))

这是我想要的,但我不禁觉得有更好的方法吗?目前 Car 中的 userid 是 Dealer 中 userid 的 FK,这是 Member 中 userid 的 FK,Member 中 userid 是存储名称的 userid 的 FK。

我是否可以直接获取 ID 在 Car 表中的经销商的所有用户 ID 和名称,同时确保他们实际上是经销商?

【问题讨论】:

    标签: mysql sql select join query-optimization


    【解决方案1】:

    基本上您的架构是下游架构

    用户 -> 会员 -> 经销商 -> 汽车

    好消息是你在这里制作了你需要的所有可能的钥匙。

    因此,要在任何表中选择任何内容,只需从用户顺流而下,例如您想要的数据

        Select * from `USER` u     
        where
        dealer.user_id = car.user_id and 
        member.user_id = dealer.user_id and 
        u.user_id = member.user_id 
    

    我在匹配记录中上游的原因是因为我们希望尽可能少地进行匹配操作。如您所见,user 表应该包含最大记录。所以我匹配car 表并获取所有user_id 匹配dealer。同样,我从dealermember,然后到user。这意味着如果我从usersmembers 再到dealercar ,用户的所有记录将与更少的记录匹配。

    但这不是万无一失的解决方案。这将取决于您的数据。因为可能是一个用户可能有多辆车的情况,那么最好顺流而下。

    【讨论】:

      【解决方案2】:

      使用JOIN 而不是子查询来获取数据。

      试试这个:

      SELECT U.userid, U.NAME 
      FROM `User` U 
      INNER JOIN Car C ON U.userid = C.userid 
      INNER JOIN Member M ON C.userid = M.userid 
      INNER JOIN Dealer D ON M.userid = D.userid;
      

      【讨论】:

        猜你喜欢
        • 2014-11-30
        • 2011-04-15
        • 2011-03-09
        • 1970-01-01
        • 2021-11-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-29
        • 2022-01-13
        相关资源
        最近更新 更多