我有以下数据库结构:
站点表
id | name | other_fields
备份表
id | site_id | initiated_on(unix timestamp) | size(float) | status
因此 Backups
表与通过 site_id
连接的 Sites
表存在多对一关系
我想以下面的格式输出数据
name | Latest initiated_on | status of the latest initiated_on row
我有以下 SQL 查询
SELECT *, `sites`.`id` as sid, SUM(`backups`.`size`) AS size
FROM (`sites`)
LEFT JOIN `backups` ON `sites`.`id` = `backups`.`site_id`
WHERE `sites`.`id` = '1'
GROUP BY `sites`.`id`
ORDER BY `backups`.`initiated_on` desc
事实是,通过上面的查询我可以实现我正在寻找的东西,但唯一的问题是我没有得到最新的 initiated_on
值。
因此,如果我在 backups
中有 3 行 site_id
=1
,则查询不会选择具有最高值的行启动_on
。它只是挑选出任何一行。
请帮忙,还有
提前致谢。
最佳答案
你应该尝试:
SELECT sites.name, FROM_UNIXTIME(b.latest) as latest, b.size, b.status
FROM sites
LEFT JOIN
( SELECT bg.site_id, bg.latest, bg.sizesum AS size, bu.status
FROM
( SELECT site_id, MAX(initiated_on) as latest, SUM(size) as sizesum
FROM backups
GROUP BY site_id ) bg
JOIN backups bu
ON bu.initiated_on = bg.latest AND bu.site_id = bg.site_id
) b
ON sites.id = b.site_id
在
GROUP BY
子查询 -bg
中,您唯一可以用于SELECT
的列是聚合的列通过函数或在GROUP BY
部分中列出。http://dev.mysql.com/doc/refman/5.5/en/group-by-hidden-columns.html
获得所有聚合值后,您需要再次将结果连接到
backups
以查找具有最新时间戳的行的其他值 -b
。最后将结果连接到
sites
表以获取名称 - 如果您想列出所有站点,甚至没有备份,也可以使用左连接。
关于php - 复杂的 MySQL 数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9229638/