mysql - INNER JOIN 查询中按 1 个以上字段排序

标签 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。有人可以帮我解决这个问题吗?

谢谢。

最佳答案

当您想要一组的第一行时,有两种方法可以实际控制在 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

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

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

我将让您决定哪一个更可取,或者它是否有任何影响。

关于mysql - INNER JOIN 查询中按 1 个以上字段排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7677780/

相关文章:

mysql - 为mysql中缺失的行选择一个默认值

mysql - 3 个表的多对多查询

mysql - 如何在mysql View 中为每一行添加排名

php - 从文件夹和 mysql 连接表中删除文件

mysql - 使用基于查询结果的 IF()

php - 没有通过 GET 请求获取 JSON 响应

sql - 如何在 microsoft sql server 上的有限时间范围内从同一个人获取 2 笔交易?

mysql - 如何使用 case-when-then 编写 mysql 查询?

mysql - INNER JOIN 3 个表引用 INFILE

mysql - 根据日期从多个表中删除