我有以下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
。有人可以帮我吗?
谢谢。
答案 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...
这将是一个较慢的查询,因为它需要为主查询中的每一行执行嵌套子查询...也许将相关的表数据加载到内存表中会加快它的速度。