mysql leftjoin由max autoincrement id?

时间:2016-03-22 14:46:36

标签: mysql max left-join

  

A)用户

     

B)订阅

     

C)包裹信息

我的表格BAC之间的链接,该查询是从A中选择的,其中B具有行ID A并按C ID加入B

完整示例:

SELECT a.*,c.packageTitle
FROM users AS a
LEFT JOIN subscribe AS b ON (b.userid = a.userid)
LEFT JOIN package AS c ON (b.packageid = c.packageid)

我的问题是如果用户在C中有多个订阅,我无法获得循环查询中的最新订阅行,我也在MAX(c.packageid)内使用SELECT也失败了。

  

目标:获取由A id分配的B中的最新记录。

非常感谢任何建议

2 个答案:

答案 0 :(得分:0)

我认为您不会试图使用MAX()获取具有最新软件包ID的记录(假设此ID是增加的自动增量列)。在下面的答案中,子查询使用GROUP BY标识每个用户记录的最新包ID。然后,此子查询用于从原始查询中过滤正确的记录。

SELECT a.userid, b.*
FROM users AS a
LEFT JOIN subscribe AS b
    ON b.userid = a.userid
LEFT JOIN package AS c
    ON b.packageid = c.packageid
INNER JOIN
(
    SELECT a.userid, MAX(c.packageTitle) AS maxPackageTitle
    FROM users AS a
    LEFT JOIN subscribe AS b
        ON b.userid = a.userid
    LEFT JOIN package AS c
        ON b.packageid = c.packageid
    GROUP BY a.userid
) t
    ON a.userid = t.userid AND c.packageTitle = t.maxPackageTitle

请注意,此查询将从称为公用表表达式(CTE)的内容中获益,该表可在其他RBDMS(如SQL Server和Oracle)中使用。 CTE会使查询的重复性更低,更易读。

答案 1 :(得分:0)

这应该很简单。在Mysql中你就像你说的那样在选择中加上一个最大值。所以它看起来像:

SELECT username, id_info, ...
FROM
(
    SELECT a.username, a.id_info, c.packageTitle, MAX(package_id)
    FROM users AS a
    LEFT JOIN subscribe AS b
        ON b.userid = a.userid
    LEFT JOIN package AS c
        ON b.packageid = c.packageid
    GROUP BY a.username, a.id_info, c.packageTitle
)

请记住列出选择中除分组最大的所有列以外的所有列,否则查询将失败。