2

我有一个photos在 MySQL 数据库中调用的表,其中包含照片文件名和其他相关信息。结构如下:

+----------+------------+-------------+
| photo_id | gallery_id | photo_fname |
|----------|------------|-------------|
|     1    |      1     |  DSC2001    |
|     2    |      1     |  DSC2002    |
|     3    |      1     |  DSC2003    |
|     4    |      2     |  DSC2004    |
|     5    |      2     |  DSC2005    |
|     6    |      2     |  DSC2006    |
|     7    |      3     |  DSC2007    |
|     8    |      3     |  DSC2008    |
|     9    |      3     |  DSC2009    |
+----------+------------+-------------+

我要做的是编写一个查询,返回每个画廊的第一张照片文件名,如下所示:

+----------+------------+-------------+
| photo_id | gallery_id | photo_fname |
|----------|------------|-------------|
|     1    |      1     |  DSC2001    |
|     4    |      2     |  DSC2004    |
|     7    |      3     |  DSC2007    |
+----------+------------+-------------+

我对此进行了研究,直到昨晚我的头痛克服了我,尽管我发现了类似的问题,但在我看来,他们似乎并不想做完全相同的事情。我尝试了子查询,我在这里尝试了其他帖子中的示例代码,但无法使其工作。要么是由于脑雾,要么只是没有找到正确的解决方案。

我只想返回如上所示的结果,仅此而已。

提前谢谢了!

更新: 我很抱歉,表名是照片,FWIW。

其次,我真正想要的只是文件名,而不是照片或画廊 ID,我只是为了视觉清晰而包括了这些。如果这引起了混乱,我深表歉意。

4

4 回答 4

6

试试这个:

SELECT *
FROM YourTable
WHERE photo_id IN ( SELECT MIN(photo_id) 
                    FROM YourTable
                    GROUP BY gallery_id)

查看演示

对于您更新的问题:

SELECT photo_fname
FROM photos
WHERE photo_id IN ( SELECT MIN(photo_id) 
                    FROM photos
                    GROUP BY gallery_id)
于 2013-02-07T18:30:23.877 回答
0

这是使用内部连接的简单方法

SELECT
  m.*
FROM sparkles as m
  INNER JOIN (SELECT
        photo_id,
        MIN(photo_id)
          FROM sparkles
          GROUP BY gallery_id) as l
    on l.photo_id = m.photo_id

演示

于 2013-02-07T18:35:05.040 回答
-2
SELECT photo_id, gallery_id, photo_frame
FROM ...
GROUP BY photo_id, gallery_id

默认情况下,对于字段列表中的任何非聚合字段,mysql 将返回它在数据库中遇到的第一个非分组值。

于 2013-02-07T18:30:48.330 回答
-2
Select * from tablename group by gallery_id;       ?
于 2013-02-07T19:44:42.867 回答