繁体   English   中英

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

[英]MYSQL equivalent of MS-Access function 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中完成此操作?

请记住,这是一个样机表,用来说明我的问题。 我有无数的记录。 它不是一个(最小/最大)值!

===编辑:11/24/2012 ===
最终的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

如果第一个图像也是具有最小值的图像,而最后一个图像也是具有最大值的图像,则此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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM