使用mysql组后获取具有最高ID的值

时间:2013-03-04 00:12:16

标签: mysql mysqli

我有一个网站,允许用户上传图片以供审核。用户首先创建审计,该审计具有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。

我希望这是足够的信息,表格相当复杂但我可以提供它们并在必要时提供样本数据,但这需要一段时间。

非常感谢任何帮助。

1 个答案:

答案 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)