[英]mysql leftjoin by max autoincrement id?
A)用户
B)订阅
C)包装信息
我有一个表,其中B
是A
和C
之间的链接,是从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.