我使用Yii框架开发一个网站,我想知道如何通过使用Yii活动记录和纯SQL来获取由create_time订购的最后5个图像,但不是在同一个相册中。
这是我的相册表:
CREATE TABLE IF NOT EXISTS `tbl_album` (
`album_id` int(11) NOT NULL AUTO_INCREMENT,
`album_name` varchar(45) DEFAULT NULL,
`album_folder_name` int(11) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`create_user_id` int(11) DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`update_user_id` int(11) DEFAULT NULL,
PRIMARY KEY (`album_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=55 ;
这是我的图片表:
CREATE TABLE IF NOT EXISTS `tbl_image` (
`image_id` int(11) NOT NULL AUTO_INCREMENT,
`image_name` varchar(100) DEFAULT NULL,
`image_description` varchar(100) DEFAULT NULL,
`image_album_id` int(11) NOT NULL,
`create_time` datetime DEFAULT NULL,
`create_user_id` int(11) DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`update_user_id` int(11) DEFAULT NULL,
PRIMARY KEY (`image_id`),
KEY `fk_image_album` (`image_album_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;
请注意我使用“create_time”来分类图像。
同样,我需要一个查询来获取由create_time排序的最后5个图像,但不是Yii活动记录和普通SQL在同一个相册中。
例如最后7张图片是:
a.jpg in the album 7
b.jpg in the album 5
c.jpg in the album 7
d.jpg in the album 6
e.jpg in the album 3
f.jpg in the album 4
g.jpg in the album 2
h.jpg in the album 1
我需要查询结果如下:
a.jpg in album 7
b.jpg in album 5
d.jpg in album 6
e.jpg in album 3
f.jpg in album 4
不喜欢以下内容:
a.jpg in album 7
b.jpg in album 5
c.jpg in album 7
d.jpg in album 6
e.jpg in album 3
提前致谢。
答案 0 :(得分:2)
试试这个:
SELECT
a.album_name,
i1.image_name
FROM tbl_album a
INNER JOIN tbl_image i1 ON i1.image_album_id = a.album_id
INNER JOIN
(
SELECT image_album_id, MIN(image_id) image_id
FROM tbl_image
GROUP BY image_album_id
) i2 ON i2.image_album_id = i1.image_album_id
AND i1.image_id = i2.image_id
ORDER BY a.album_name DESC
LIMIT 5;
JOIN
with:
SELECT image_album_id, MIN(image_id) image_id
FROM tbl_image
GROUP BY image_album_id
将确保每张专辑都会返回第一张图片。因此,每张专辑只会有一张图片,然后LIMIT 5
会将结果集限制为只有5张专辑。
请注意: ORDER BY
子句将确定LIMIT 5
子句将返回哪五个相册。因此,不要指望相册以它们存储为您问题中的预期结果的方式返回,因为表中的记录没有特定的顺序。它们存储为一个集合,您必须在查询中指定ORDER BY
子句才能按特定顺序获取它们。
更新:如果您要为每张专辑查找上次创建的图片,请使用MAX(creaet_time)
,如下所示:
SELECT
a.album_name,
i1.image_name,
date_format(i1.create_time, '%Y-%m-%d') create_time
FROM tbl_album a
INNER JOIN tbl_image i1 ON i1.image_album_id = a.album_id
INNER JOIN
(
SELECT image_album_id, MAX(create_time) LatestCreateTime
FROM tbl_image
GROUP BY image_album_id
) i2 ON i2.image_album_id = i1.image_album_id
AND i1.create_time = i2.LatestCreateTime
ORDER BY i1.create_time DESC
LIMIT 5;
更新2:对于重复值,请使用DISTINCT
关键字,或者您可以改为使用MAX(image_id)
,因为image_id
是自动增量的,例如这样:
SELECT
a.album_name,
i1.image_name,
date_format(i1.create_time, '%Y-%m-%d') create_time
FROM tbl_album a
INNER JOIN tbl_image i1 ON i1.image_album_id = a.album_id
INNER JOIN
(
SELECT image_album_id, MAX(image_id) LatestId
FROM tbl_image
GROUP BY image_album_id
) i2 ON i2.image_album_id = i1.image_album_id
AND i1.image_id = i2.LatestId
ORDER BY i1.create_time DESC
LIMIT 5;
答案 1 :(得分:1)
我找到了另一个问题的解决方案!
SELECT *
FROM tbl_image
WHERE image_id IN (SELECT MAX(image_id)
FROM tbl_image
GROUP BY image_album_id)
ORDER BY create_time DESC
LIMIT 5;
它给了我相同的结果,没有使用降低性能的内连接, 您对此解决方案有何看法?
答案 2 :(得分:0)
试试这个并告诉我它返回的内容,
select m.image_name,a.album_name
from tbl_album a inner join
tbl_image m on a.album_id=m.image_id
group by m.image_name,a.album_name
order by 2 LIMIT 5