MYSQL等效于MS Access函数first()last()



为了更好地解释我需要什么,请查看下表:

ID --- image
A1 --- a1_01.jpg
A1 --- a1_02.jpg
B7 --- b7_01.jpg
B7 --- b7_02.jpg
D3 --- D3_04.jpg
D3 --- D3_99.jpg
... (From A to Z)
Z9 --- Z9_12.jpg
Z9 --- Z9_13.jpg
Z9 --- Z9_20.jpg
Z9 --- Z9_99.jpg
...and so on

我需要结果为:

ID --- Image
A1 --- a1_01.jpg
B7 --- b7_01.jpg
D3 --- D3_04.jpg
...
Z9 --- Z9_12.jpg
...and so on

在MS Access中,这可以通过SELECT ID, First(image) AS 'Image' FROM Photos来完成

如何在MYSQL中实现这一点

请记住,这是一个模型表,用来说明我的问题。我有很多记录。它不是一个单一(最小/最大)的价值!

===编辑:2012年11月24日===
最终SQL代码:

SELECT ID, Min(image) AS 'Image' 
FROM Photos 
GROUP BY ID

谢谢@triclosan&iDevlop!!!

正如我可能看到的

select ID, min(image)
from tbl
group by ID
SELECT ID, Min(image) AS 'Image' FROM mockup GROUP BY ID

如果第一个图像也是最小值的图像,而最后一个图像也是最大值的图像

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,在本例中它是第一个。。。那么我们就有问题了。如果没有特定的ORDERBY,行将以不可预测的方式返回。是的,它们通常/几乎总是按照它们在表空间中的物理顺序返回,但我们不能依赖于此。

例如,请参阅此问题和答案:

SQL处理默认排序顺序的最佳实践

这意味着,如果我们不知道行是如何排序的,我们就无法判断哪一行是第一行,哪一行最后一行。例如,请参阅此查询:

Select
Distinct ID,
(select image from tbl a where a.ID = tbl.ID LIMIT 1) as first_image
From tbl

这可能会返回您想要的内容。但是由于我省略了ORDERBY子句,所以不能保证它总是有效的。注意,我还必须删除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

服务器可以从每个组中自由选择任何值,因此除非它们相同,否则所选的值是不确定的因此,服务器几乎总是返回第一行这一事实只是巧合,而且没有记录在案。

最新更新