php - 仅选择带有某些 where 子句的连接表中的最大值

标签 php mysql greatest-n-per-group

好吧,在我研究并尝试了多种方法(主要是在 stackoverflow 上找到的)之后,我仍然无法正常工作。

我有一个像这样的mysql表(缩短了,时间当然是时间戳):

id docid wardid version approved endingtime
 1   1      1      1        1    5 days
 2   1      1      2        1    20 days
 3   1      1      3        0    40 days
 4   2      2      1        0    30 days
 5   2      2      2        1    50 days

以及另外两个表,其中包含一些值,例如 docidnamewardid

现在,它想要的是选择未批准或在特定结束时间内的所有行(每个文档条目中仅一行),但仅选择具有最高版本的行。所以在这个例子中我只想获取 id 为 3 的行 当我写这篇文章时,听起来很简单,但我完全迷失了。还不够,我内心的白痴删除了所有尝试(但最后一次):

SELECT MAX(dv.version), dv.docid, dv.id, dv.approved, dv.endingtime, d.name, w.name
FROM (doc_versions as dv
    LEFT JOIN docs as d ON d.id = dv.docid
    LEFT JOIN wards as w ON w.id = d.wardid
WHERE (approved < 1 AND ...)
OR (dv.endingtime < $time AND ...)
GROUP BY dv.docid

希望你能帮助我。我认为这是最糟糕的尝试(这让我昨天愤怒地退出了;))

编辑: 我上次的尝试似乎有效,必须再尝试一下。

SELECT v1.docs_id, v1.id as docversion, v1.approved, v1.approver, d.name as docname, w.name as wardname, d.wards_id as wardsid, v1.validity_endtime as deadline, v1.creator
        FROM 
        (
            doc_versions v1
            LEFT JOIN docs as d ON d.id = v1.docs_id 
            LEFT JOIN wards as w ON w.id = d.wards_id
        ) 
        INNER JOIN
        (
          SELECT MAX(version) version, docs_id
          FROM doc_versions
          GROUP BY docs_id
        ) v2
          ON v1.version = v2.version
          AND v1.docs_id = v2.docs_id
        WHERE (approved < 1 AND approver = ".$userid.($wardid > 0 ? ' AND wardsid = '.$wardid : '').")
        OR (v1.validity_endtime < $time AND creator = ".$userid.($wardid > 0 ? ' AND wardsid = '.$wardid : '').")";

最佳答案

类似这样的事情应该做:

SELECT *
FROM doc_versions dv1
INNER JOIN (
    SELECT id, MAX(version) version
      FROM doc_versions
     WHERE (approved = 0 OR endingtime < $time ...)
     GROUP BY id
) dv2 ON dv1.id = dv2.id AND dv2.version = dv1.version

在子查询中,您构建一个包含每个 id 和最大有效版本的表;在外部查询中,您根据这两个值连接初始表。

关于php - 仅选择带有某些 where 子句的连接表中的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21185128/

相关文章:

mysql - 将 Zope 数据转换为 Mysql

php - MYSQL 为最后 5 条不同的记录选择 5 条记录

sql - PostgreSQL 选择给定 ID 的最新条目

postgresql - Postgres : getting the maximum and minimum values, 和它们出现的时间戳

php - POST 提交未验证时保存表单数据

PHP - 格式化 HH :MM:SS to 12hr HH:MM:a string

php - PHP统计分析

mysql - GORM/Hibernate 未创建正确的 INSERT 语句

php - mysql/php : Update multiple rows

php - 如何按年份降序和月份升序排序表格?