【问题标题】:Left Join, Order by, MySQL OptimizationLeft Join、Order by、MySQL 优化
【发布时间】:2011-02-21 21:36:44
【问题描述】:

我有一个这样的查询:

   SELECT m...., a...., r....
     FROM 0_member AS m                 
LEFT JOIN 0_area AS a ON a.user_id = (SELECT user_id 
                                        FROM `0_area` 
                                       WHERE user_id = m.id 
                                    ORDER BY sec_id ASC LIMIT 1)
LEFT JOIN 0_rank as r ON a.rank_id = r.id 
    WHERE m.login_userid = '$username'

这个想法是从 0_area 表中获取第一行,从而尝试内部连接。但是,它没有按预期工作。

在 0_area 和 0_member 之间,0_member.id = 0_area.user_id。但是,0_area.user_id 有多行,我希望行具有 sec_id 的最低值。

有什么帮助吗?

【问题讨论】:

  • @Scrum Meister sec_id 不是唯一的,制作唯一是否有帮助?
  • @jeremy-roy 不,只是问问。
  • @The Scrum Meister 啊,我想我可能会学到一些新东西:)
  • @jeremy-roy 如果sec_id 是唯一的,您可以在cyberwiki 的答案中省略加入的a.user_id = g1.user_id 部分,并使用更好的索引。

标签: sql mysql left-join outer-join


【解决方案1】:
   SELECT m...., a...., r....
     FROM 0_member AS m               
LEFT JOIN (SELECT user_id, min(sec_id) minsec
           FROM `0_area`
           GROUP BY user_id) g1 on g1.user_id=m.id
LEFT JOIN 0_area AS a ON a.user_id = g1.user_id and a.sec_id=minsec
LEFT JOIN 0_rank as r ON a.rank_id = r.id 
    WHERE m.login_userid = '$username'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多