MYSQL相当于MS-Access函数first()last()

时间:2012-11-22 13:52:05

标签: mysql sql sql-server ms-access

为了更好地解释我的需求,请查看此表:

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中完成此操作?

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

===编辑:11/24/2012 ===
最终SQL代码:

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

谢谢@triclosan& @iDevlop !!!

3 个答案:

答案 0 :(得分:2)

我可能会看到

select ID, min(image)
from tbl
group by ID

答案 1 :(得分:1)

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

答案 2 :(得分:0)

如果第一个图像也是具有最小值的图像,并且最后一个图像也是具有最大值的图像,则此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 best practice to deal with default sort order

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

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

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