php - 通过 JOIN 和 GROUP BY 获取最近的行?

标签 php mysql sql codeigniter

这是表格相册,它的结构和数据是,

enter image description here

这是另一个表photos,它的结构和数据是,

enter image description here

我想列出所有相册名称、相应相册的照片总数、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/

相关文章:

sql - 'one'表中的一对多join和group by id

mysql - 查询同一台服务器的两个数据库

php - GET 中的 GET

php - 使用自定义异常处理程序捕获 "PDOException"

php - 如何在 PHP 中以及互联网消失时长时间保持 session 详细信息

mysql - 当我使用内联接进行更新时,更改 ON 列子句会影响更新吗?

php - 在 PHP 中从 XML 值创建 XML?

javascript - 使用 AJAX 提交表单 PHP JQuery 将我带到操作页面

mysql - 从子查询中选择列

sql - 用缺少的列值填充 postgres 表行