这是表格相册
,它的结构和数据是,
这是另一个表photos
,它的结构和数据是,
我想列出所有相册名称、相应相册的照片总数、JOIN 和 GROUP BY 最后上传的图像。
这是我现在正在使用的 Codeigniter 查询。一切正常,除了它获取 image
列值的第一行而不是最新的值。
$query = $this->db->select('albums.name, photos.image, albums.created, albums.id,
COUNT(photos.id) as total')
->from('photos')
->join('albums', 'albums.id = photos.album_id')
->order_by('photos.id', 'desc')
->group_by('photos.album_id')
->limit($limit, $offset)
->get();
上面生成的 SQL 查询是,
SELECT `albums`.`name`, `photos`.`image`, `albums`.`created`, `albums`.`id`, COUNT(photos.id) as total FROM `photos` JOIN `albums` ON `albums`.`id` = `photos`.`album_id` GROUP BY `photos`.`album_id` ORDER BY `photos`.`id` DESC LIMIT 10
对于这两个查询,结果是,
[{"name":"Movie Stills","image":"assets/images/albums/2016/01/84786b91857b45fa9391943e9a468ac6.jpg","created":"2016-01-19 23:41:53","id":"3","total":"3"},{"name":"Firstlook","image":"assets/images/albums/2016/01/6e90cdfdec444dfc53f4a7c30a2ac31e.jpg","created":"2016-01-19 23:16:05","id":"1","total":"2"}]
如果您查看图像键,它会显示第一个而不是最后一行的值。
我对这两种查询解决方案(Codeigniter/SQL)都持开放态度。
最佳答案
$query = $this->db->select('albums.name, ph.image, albums.created, albums.id,
COUNT(ph.id) as total')
->from('photos as ph') // added prefix
->join('albums', 'albums.id = ph.album_id')
->where('ph.id = (SELECT MAX(ph1.id) FROM photos as ph1 WHERE ph1.album_id=ph.album_id)',NULL,FALSE) // subquery to get latest record
->order_by('ph.id', 'desc')
->group_by('ph.album_id')
->limit($limit, $offset)
->get();
where() 中的 NULL,FALSE 告诉 CodeIgniter 不要转义查询,这可能会弄乱 Sub query in CodeIgniter
或者,SQL 查询是
SELECT `albums`.`name`, `ph`.`image`, `albums`.`created`, `albums`.`id`, COUNT(ph.id) as total FROM `photos` as `ph` JOIN `albums` ON `albums`.`id` = `ph`.`album_id` WHERE ph.id IN (SELECT MAX(ph1.id) FROM photos as ph1 WHERE ph1.album_id=ph.album_id) GROUP BY `ph`.`album_id` ORDER BY `ph`.`id` DESC LIMIT 10
关于php - 通过 JOIN 和 GROUP BY 获取最近的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34917060/