【发布时间】:2015-04-19 00:07:22
【问题描述】:
我有一个查询,当它的尝试状态为 2 或 3 并且超过 7 天时,它会获取所有文档:
SELECT D.*,
GROUP_CONCAT(A.status) as statuses,
MAX(A.datetime) as maxDate FROM documents D
LEFT JOIN attempts A on A.documentId = D.id
GROUP BY D.id
HAVING statuses NOT LIKE '%2%'
AND statuses NOT LIKE '%3%'
AND DATE(maxDate) < DATE_SUB(CURDATE(), INTERVAL 7 DAY)
我将 A.status 分组为状态并检查 2 和 3,然后检查 MAX 日期以查看它是否为 7 天。
但是,我听说使用 HAVING 并不是最好的方法,而且我的 LIKE 是一个非常糟糕的主意。有谁知道这是真的还是有更好的方法来优化这段代码?我已经在这几天了,这似乎是最快的方法(尝试过子查询和其他一些方法)。
编辑:为了更好地解释结构,一个文档可以包含无限数量的尝试。尝试使用 documentId 连接到文档的 id。
【问题讨论】:
-
我认为可以通过修改加入表格的方式来解决问题。你能提供一些关于尝试表结构的信息吗?
-
澄清一下:没有状态 2,3 并且超过 7 天 = 状态 2,3 当文档只有 6 天时允许?
-
必须满足所有三个条件:永远不能有 2 或 3,并且日期必须始终早于 7 天。
标签: mysql join optimization having