0

我有一个网站,允许用户上传图像以进行审核。用户首先创建一个审计,它有一个随机数作为 auditID 和一个 dateStart(用户选择的日期,存储为 DATE 而不是 DATETIME)存储在审计表中。然后他们选择要上传的图像,然后为其分配一个 ID (imageID) 和它在服务器上的文件路径 (imageLocation) 和一个始终为“标准”的类型,该类型存储在图像表中。auditID 是图像表中的外键。

如果相同的图像被重新用于另一次审计,则在数据库中为其创建另一个条目,该条目具有与以前相同的值,只是一个新的 imageID 和一个具有新 dateStart 的新 auditID。

然后通过使用按其 imageLocation 对图像进行分组的脚本来显示这些图像,以便显示每个图像的一个实例以及使用 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 的图像实例。

我希望这是足够的信息,表格非常复杂,但如果需要,我可以提供它们和示例数据,但这需要一段时间。

任何帮助将不胜感激。

4

1 回答 1

1

尝试重新表述问题:您正在存储image具有关联记录的audit记录。有时会加载重复的图像,这些图像通过相同的imageLocation. 查找最新的图像记录及其关联的审计记录。

audit我认为您的查询看起来不错,但如果所有图像 id 都是唯一的,则无需在内部查询中加入表。之后加入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)
于 2013-03-04T00:48:59.223 回答