[英]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
没有字符串麻烦的更通用的版本是:
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.