要获得最新contract_to值,您需要一个MAX()聚合。执行此操作的正确方法是使用子查询连接来仅获取article和MAX(contract_to)值,然后将其与行的剩余值连接。最后,整个结构可以靠在articles桌子上。
SELECT
articles.*,
contracts.*
FROM
articles
/* Join against a subquery which returns only the article and latest contract_to */
LEFT JOIN (
SELECT article, MAX(contract_to) AS contract_to
FROM contracts
GROUP BY article
) maxcontract ON articles.article_id = maxcontract.article
/* and join that against the rest of the contracts table, on those two column values */
JOIN contracts
ON maxcontract.article = contracts.article
AND maxcontract.contract_to = contracts.contract_to
由于 MySQL 对GROUP BY子句的内容很宽松,这种方法实际上可能不是必需的,单独对contracts表进行连接,您可能可以单独使用子查询连接来执行此操作,但这在大多数其他 RDBMS 中不起作用,这是真正正确的方法是不依赖 MySQL 的怪异行为。