php - 复杂的 MySQL 数据库查询

标签 php mysql

我有以下数据库结构:

站点表

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
  1. GROUP BY 子查询 - bg 中,您唯一可以用于 SELECT 的列是聚合的列通过函数或在 GROUP BY 部分中列出。

    http://dev.mysql.com/doc/refman/5.5/en/group-by-hidden-columns.html

  2. 获得所有聚合值后,您需要再次将结果连接到 backups 以查找具有最新时间戳的行的其他值 - b

  3. 最后将结果连接到 sites 表以获取名称 - 如果您想列出所有站点,甚至没有备份,也可以使用左连接。

关于php - 复杂的 MySQL 数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9229638/

相关文章:

php - 如何在图像上叠加忙碌图标?

php - 很多查询来提取用户照片和他们的评论。 (蛋糕PHP)

MySQL 行锁定和更新

php - 哪个更快? 100万行数组还是数据库?

Mysql时区选择

php - MYSQL表变大

MySQL 用空格连接列

php - 的意思 ?在 SQLite 中标记

php - 使用PHP将csv文件导入mysql

php - 如何仅在 laravel 中使用 DATE 获取数据?