在INNER JOIN查询中按多个字段排序

时间:2011-10-06 16:52:39

标签: mysql sql inner-join

我有以下SQL查询:

SELECT products.id, 
       products.title, 
       products.size, 
       products.price, 
       products.text_description, 
       products.main_description, 
       products.priority, 
       gallery.id, 
       gallery.main 
       FROM gallery INNER JOIN products ON gallery.id=products.id 
       GROUP BY products.priority ASC

数据库中的每个产品都有几个与之关联的图像。上面的查询列出了该产品的1张图片。每张图片都有一个字段,其中包含上传图像时条目所获得的时间戳。我需要修改上面的SQL查询,例如,获取为特定产品上传的第一张图片,例如ORDER BY UPLOAD_TIME ASC。有人可以帮我吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

当你想要一个组的第一行时,有两种方法可以实际控制你在MySQL中获得哪一行

使用限制1

SELECT products.id, 
       products.title, 
       products.size, 
       products.price, 
       products.text_description, 
       products.main_description, 
       products.priority, 
       gallery.id, 
       gallery.main 
FROM products
CROSS JOIN 
 (SELECT   
       gallery.id, 
       gallery.main  
    FROM 
        gallery
    WHERE
        products.[id] = gallery.[id]
    ORDER BY 
        gallery.[timestamp] DESC
    LIMIT 1) gallery
GROUP BY 
    products.priority ASC

现在这也有效。 使用MAx()

SELECT products.id, 
       products.title, 
       products.size, 
       products.price, 
       products.text_description, 
       products.main_description, 
       products.priority, 
       gallery.id, 
       gallery.main 
FROM products
INNER JOIN gallery 
ON products.id = gallery.id
INNER JOIN 
   (SELECT   
       max(gallery.timestamp) timestamp, 
       gallery.[id]
    FROM 
        gallery
    GROUP BY
        gallery.[id]
    ) maxgallery
ON gallery.id = maxgallery.id and gallery.timestamp = maxgallery.timestamp
GROUP BY 
    products.priority ASC

除了潜在的性能差异之外,您必须特别注意这两个查询如何处理关系

如果使用LIMIT 1共享id和时间戳的两条记录将只返回一条记录。使用MAX()时,可以返回多条记录。

我会留给你哪一个更好,或者它是否有所作为。

答案 1 :(得分:0)

INNER JOIN 
    (SELECT TOP 1 
         col1,
         col2,...,
         coln 
    FROM 
        products 
    WHERE
        products.[id] = gallery.[id]
    ORDER BY
        products.[timestamp] DESC)
ON...

这将是一个较慢的查询,因为它需要为主查询中的每一行执行嵌套子查询...也许将相关的表数据加载到内存表中会加快它的速度。