繁体   English   中英

MySQL的左联接最大自动增量ID?

[英]mysql leftjoin by max autoincrement id?

A)用户

B)订阅

C)包装信息

我有一个表,其中BAC之间的链接,是从A中选择的查询,其中B具有A行ID,并通过B ID将C连接起来。


完整示例:

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具有多个预订,则无法在循环查询中获取最新的预订行,我也使用SELECT内的MAX(c.packageid)也失败了。


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

任何建议都非常感谢

我认为尝试使用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将使查询的重复性降低,可读性更高。

这应该足够简单。 正如您所说的,在Mysql中,将最大选择与group by一起放置。 所以它看起来像:

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
)

记住要列出选择中也要分组的所有列,但要采用最大值的列除外,否则查询将失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM