我有以下 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/