【问题标题】:Return Only Last Row LEFT JOIN仅返回最后一行 LEFT JOIN
【发布时间】:2014-05-01 10:33:42
【问题描述】:
SELECT DISTINCT msg.userid, msg.messages, user.fullname, prof.path
FROM messages AS msg
LEFT JOIN users AS user ON msg.userid = md5( user.userid )
LEFT JOIN profile AS prof ON msg.userid = prof.userid
ORDER BY msg.date ASC
LIMIT 0 , 30

上面的代码可以运行,但问题是结果有重复值:

userid | messages | fullname | path
985434 | hello... | Foo Bar  | /path/to/hello.jpg
985434 | hello... | Foo Bar  | /path/to/new.jpg

问题是PATH如何将path 的结果限制为最新的?还是每个全名只有一个?...这让我很生气感谢您的理解。

【问题讨论】:

  • 按 msg.userid 使用组
  • 是的..有没有办法将左连接限制为 1...我尝试了子查询并将 LIMIT 0,1 ..问题是除了第一个路径之外的所有其他路径成为null

标签: mysql sql left-join greatest-n-per-group


【解决方案1】:

您可以通过使用GROUP_CONCAT() 所有路径并在组上使用SUBSTRING_INDEX() 来选择第一个路径,您也可以在GROUP_CONCAT( prof.path order by some_col DESC ) 中使用 order by 来实现这一点

SELECT 
 msg.userid,
 msg.messages, 
 user.fullname, 
SUBSTRING_INDEX(GROUP_CONCAT( prof.path ),',',1) AS path
FROM messages AS msg
LEFT JOIN users AS USER ON msg.userid = MD5( user.userid )
LEFT JOIN profile AS prof ON msg.userid = prof.userid
GROUP BY msg.userid
ORDER BY msg.date ASC
LIMIT 0 , 30

【讨论】:

    【解决方案2】:

    您要做的是选择用户消息。您还想为每条消息选择一个路径。这是一个关于如何执行此操作的示例:

    SELECT msg.userid, msg.messages, users.fullname, 
      (select max(path) from profile where profile.userid = msg.userid) as maxpath
    FROM messages AS msg
    LEFT JOIN users ON msg.userid = md5( users.userid )
    ORDER BY msg.date ASC;
    

    您也可以使用 group_concat 而不是 max,来获取所有路径的列表。此外,子选择可能更复杂,例如查找最后一个日期(前提是该表中有日期信息)。

    顺便说一句,您为什么将外部加入用户留给消息?是否有没有关联用户的消息?

    【讨论】:

    • 非常感谢!您能推荐任何有关如何提高我的 sql 技能的电子书或教程吗?
    • @user3204806 - 在这里要小心,这会通过按字母数字对所有路径进行排序来选择MAX(path)。它确实选择最近的路径。
    • @MatBailie。那是真实的。要获得最近的路径,配置文件中必须有日期信息,并且如上所述,子选择语句会变得更加复杂。
    • @user3204806:不,抱歉。我已经使用 SQL 很多很多年了,所以最近对我来说不需要电子书或在线教程。
    • @MatBailie 谢谢...我修改了查询,现在可以正常工作了。感谢人们的帮助
    猜你喜欢
    • 2013-11-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多