繁体   English   中英

MySQL获取组中连接表的第一行

[英]MySQL get first row of joined table in group

我有一个简单的一对多关系。 一个表是一个相册列表,另一个表是照片列表。 每张照片只能属于一个相册,但是一个相册包含许多图像。

现在,我想在一个查询中获得所有专辑的列表。 我想要的信息是相册本身的一些值(例如相册的name ),该相册中的图像总数以及第一张图像的某些值。

我已经有了图像总数和相册名称,但是在尝试获取第一个图像值时遇到了一些问题。

SELECT albums.id, albums.name, COUNT(photos.id) AS imageCount 
   FROM albums 
   LEFT JOIN photos ON albums.id = photos.albumid 
   GROUP BY name 
   ORDER BY id DESC

我从其他 答案中尝试了几种方法,但似乎做错了。 由于我也使用COUNT() ,因此特别令人困惑。

我创建了一个包含该查询的sqlfiddle以及一个小型示例数据库。 那么,如何获得照片第一个元素的一些值?

SELECT x.id
     , x.name
     , total
     , y.id
     , y.url
  FROM 
     ( SELECT a.*
            , COUNT(p.id) total
            , MIN(p.id) min_id
         FROM albums a
         LEFT
         JOIN photos p
           ON p.albumid = a.id
        GROUP
           BY a.id
     ) x
  LEFT
  JOIN photos y  
    ON y.id = x.min_id;

您可以通过以下查询进行操作:

SELECT albums.id, 
       albums.name, 
       COUNT(photos.id) AS imageCount , 
       (select url 
        from photos 
        where id =(select min(id) 
                   from photos internal_photo 
                   where albums.id = internal_photo.albumid )) as photo_url
FROM albums 
LEFT JOIN photos ON albums.id = photos.albumid 
GROUP BY name 
ORDER BY id DESC

我使用URL格式获取第一个,如果您使用其他格式,则需要另一个联接以获取第一个。

SELECT A.*, P.url
FROM 
    (
      SELECT albums.id, albums.name, COUNT(photos.id) AS imageCount 
      FROM albums 
      LEFT JOIN photos ON albums.id = photos.albumid 
      GROUP BY name 
    ) A
LEFT JOIN (
        SELECT `albumid`, MIN(`url`) as `url`
        FROM photos
        GROUP BY `albumid`
    ) P
  ON A.id = P.`albumid`
ORDER BY id DESC

没有字符串麻烦的更通用的版本是:

SQL小提琴演示

SELECT *
FROM 
    (
      SELECT albums.id, albums.name, COUNT(photos.id) AS imageCount 
      FROM albums 
      LEFT JOIN photos ON albums.id = photos.albumid 
      GROUP BY name 
      ORDER BY id DESC
    ) A
LEFT JOIN (
        SELECT photos.`albumid`, photos.`url`
        FROM photos
        LEFT JOIN (
                SELECT `albumid`, MIN(`id`) as `id`
                FROM photos p1
                GROUP BY `albumid`
              ) P1
          ON photos.`albumid` = p1.`albumid`
         AND photos.`id`  = P1.`id`
    ) P
  ON A.id = P.`albumid`

如果使用MySQL作为数据库,则可以运行此查询

SELECT albums.id, albums.name, photos.url, COUNT(photos.id) AS imageCount
FROM albums 
LEFT JOIN photos ON albums.id = photos.albumid 
GROUP BY name 
ORDER BY id DESC

因为在MySQL中分组总是返回第一行值。 CMIIW。 但是您也可以尝试此查询(仅嵌套子查询)。

SELECT albums.id, albums.name, COUNT(photos.id) AS imageCount, (
    SELECT photos.url 
    FROM photos 
    WHERE albums.id = photos.albumid 
    ORDER BY id ASC 
    LIMIT 1
)
FROM albums 
LEFT JOIN photos ON albums.id = photos.albumid 
GROUP BY name 
ORDER BY id DESC

暂无
暂无

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

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