A)用户
B)订阅
C)包裹信息
我的表格B
是A
和C
之间的链接,该查询是从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中的最新记录。
非常感谢任何建议
答案 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
)
请记住列出选择中除分组最大的所有列以外的所有列,否则查询将失败。