好吧,在我研究并尝试了多种方法(主要是在 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
以及另外两个表,其中包含一些值,例如 docid
的 name
和 wardid
现在,它想要的是选择未批准或在特定结束时间内的所有行(每个文档条目中仅一行),但仅选择具有最高版本的行。所以在这个例子中我只想获取 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/