如果第一个图像也是具有最小值的图像,并且最后一个图像也是具有最大值的图像,则此 MySql 查询将返回您想要的内容:
Select ID, min(image) as first_image, max(image) as last_image
From Tbl
Group By ID
否则,由于 MySql 没有first()
或last()
聚合函数,你可以使用这样的东西:
Select
Distinct ID,
(select image from tbl a where a.ID = tbl.ID order by something ASC LIMIT 1) as first_image,
(select image from tbl a where a.ID = tbl.ID order by something DESC LIMIT 1) as last_image,
From tbl
但请注意,您必须按某个字段对表格进行排序。如果您无法按某个字段对表格进行排序,则无法区分哪个值在前,哪个值在后。
我经常看到这个查询,看起来不错,应该返回第一个字段:
Select ID, image
From tbl
Group by ID
这是一个非标准的 Sql 查询,通常有效并且(几乎?)总是正确返回第一张图像。但是由于image
不在group by
子句中并且不与任何聚合函数相关联,服务器可以自由地返回任何值。它似乎总是返回第一个值,但不能保证,我不想使用它。
一些解释:
在您的示例中,最小值始终与第一个一致,因此无法从您的示例中判断您是在寻找最小值还是在寻找第一个。
假设这是您的数据:
ID image
=============
A1 a1_02.jpg
A1 a1_01.jpg
如果您正在寻找最小值 ( A1, a1_01.jpg
),min(image)
这正是您所需要的,它会起作用!
但是如果你想得到A1, a1_02.jpg
,在这个例子中是第一个......那么我们就有问题了。如果没有特定的 ORDER BY,行将以不可预测的方式返回。是的,它们经常/几乎总是按照它们在表空间中的物理顺序返回,但我们不能依赖这一点。
例如看这个问题和答案:
处理默认排序顺序的 SQL 最佳实践
这意味着如果我们不知道行是如何排序的,我们就无法分辨哪个是第一个,哪个是最后一个。例如,请参阅此查询:
Select
Distinct ID,
(select image from tbl a where a.ID = tbl.ID LIMIT 1) as first_image
From tbl
这可能会返回您正在寻找的内容。但由于我省略了 ORDER BY 子句,因此不能保证它总是有效。请注意,我还必须删除 last_image,因为没有办法告诉 MySql 按默认顺序 DESC 对表进行排序,因为这样的默认顺序不存在。
此查询可能还会返回第一张图片:
Select ID, image
From tbl
Group By ID
在标准 SQL 中,我们不能在 select 中引用非聚合列,但在 MySql 中是可能的。它可能会返回每个 ID 的第一张图片。但是让我们看看文档:
http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html
"The server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate."
So the fact that the server almost always returns the first row is just coincidence, and it's not documented.