我有一个网站,允许用户上传图片以供审核。用户首先创建审计,该审计具有auditID的随机数和存储在审计表中的dateStart(用户选择的存储为DATE而不是DATETIME的日期)。然后,他们选择要上传的图像,然后在服务器(imageLocation)上分配ID(imageID)和文件路径,以及存储在图像表中的始终为“标准”的类型。 auditID是图像表中的外键。
如果同一图像被重新用于另一次审核,则数据库中的另一个条目将与之前具有相同的值,只是一个新的imageID,以及具有新dateStart的新auditID。
然后使用脚本按照图像位置对图像进行分组来显示这些图像,以便使用MAX(dateStart)显示每个图像的一个实例以及上次审核的名称。
除非用户使用相同的图像进行多次审核,并使用相同的dateStart,否则这种情况很有效,在同一日期,每次审核都会显示一次。最简单的方法是将dateStart从date更改为datetime,但这不是一个可行的选项,所以下一个最好的方法是不仅找到MAX(dateStart)而且找到MAX(imageID)。
我尝试在GROUP之后添加SORT BY i.imageID LIMIT 1 DESC但是它只返回一个图像而不是每个图像的最新实例。
这就是我到目前为止......
SELECT i.imageID AS newest_image,
i.userID AS image_userID,
i.auditID AS image_auditID,
i.type AS image_type,
i.imageLocation AS location,
a.*
FROM image i
JOIN audit a
ON i.auditID = a.auditID
JOIN
(
SELECT i.imageLocation, MAX(a.dateStart) MaxDate
FROM image i
JOIN audit a
ON i.auditID = a.auditID
WHERE i.userID = '$id'
AND i.type = 'standard'
GROUP BY i.imageLocation
)
g ON g.MaxDate = a.dateStart
AND g.imageLocation = i.imageLocation
WHERE i.userID = '$id'
AND i.type = 'standard'
AND i.imageLocation NOT LIKE '%standard_examples%'"
我希望它返回与现在相同的结果,但如果同一个图像在同一天使用了不止一次,那么我希望图像的实例具有最高的imageID。
我希望这是足够的信息,表格相当复杂但我可以提供它们并在必要时提供样本数据,但这需要一段时间。
非常感谢任何帮助。
答案 0 :(得分:1)
尝试重新定义问题:您正在存储具有关联image
记录的audit
条记录。有时会加载重复的图像,并通过具有相同的imageLocation
来识别这些图像。查找最新的图像记录及其相关的审核记录。
我认为您的查询看起来是正确的,但如果所有图像ID都是唯一的,则无需加入内部查询中的audit
表。之后加入audit
表。如果id
已经被识别,也无需再次加入最大日期。
以下是对同一查询的尝试,为了清楚起见,我只是将子查询拉出到CTE中,但您可以将其放回原来的位置。
WITH images AS (
SELECT imageLocation, MAX(imageID) AS newest_imageID
FROM image
WHERE i.userID = '$id'
AND i.type = 'standard'
AND i.imageLocation NOT LIKE '%standard_examples%'
GROUP BY imageLocation
)
SELECT i.imageID AS newest_image,
i.userID AS image_userID,
i.auditID AS image_auditID,
i.type AS image_type,
i.imageLocation AS location,
a.*
FROM image i
JOIN images ni ON (i.imageID = ni.newest_imageID)
JOIN audit a ON (i.auditID = a.auditID)
<强>更新强>
如果没有CTE,您可以回到原始格式(注意我没有创建表和加载的数据进行测试,这只是基于查询中的问题):
SELECT i.imageID AS newest_image,
i.userID AS image_userID,
i.auditID AS image_auditID,
i.type AS image_type,
i.imageLocation AS location,
a.*
FROM image i
JOIN ( SELECT imageLocation, MAX(imageID) AS newest_imageID
FROM image i
WHERE i.userID = '$id'
AND i.type = 'standard'
AND i.imageLocation NOT LIKE '%standard_examples%'
GROUP BY imageLocation
) ni ON (i.imageID = ni.newest_imageID)
JOIN audit a ON (i.auditID = a.auditID)