在 codeigniter 中显示 2 个具有活动记录的表中的 3 个最新数据
Posted
技术标签:
【中文标题】在 codeigniter 中显示 2 个具有活动记录的表中的 3 个最新数据【英文标题】:Show 3 latest data from 2 tables with active record in codeigniter 【发布时间】:2020-12-22 16:30:25 【问题描述】:我无法。
表格
-
专辑:id_album,专辑名
照片:id_photo、album_id、photo_name
当前数据
专辑:
-
汽车
自行车
飞机
照片:
-
自行车 001
自行车 002
001 号飞机
002 号飞机
003 号飞机
汽车001
条件是如何按 3 个最新相册显示数据,每个相册有 1 张最新照片。也许结果是这样的:
-
汽车001,
003 号飞机,
自行车 002
我在 codeigniter 中的活动记录:
$this->db->select('album.album_name, album.id_album, photo.id_photo, photo.photo_name);
$this->db->join('album', 'photo.album_id = album.id_album');
$this->db->limit(3);
$this->db->order_by('album.id_album', 'desc');
$this->db->order_by('photo.id_photo', 'desc');
$this->db->group_by('album.album_name');
return $this->db->get($this->table)->result();
如果我使用上面的查询,数据会是这样的:
-
汽车001,
001 号飞机,
自行车 001
任何帮助将不胜感激
【问题讨论】:
你的数据和列名一点都不清楚。但是你必须同时使用 GroupBy 和 Max。 【参考方案1】:要为每张专辑选择最新记录,您可以使用自我加入
SELECT a.album_name, a.id_album, p.id_photo, p.photo_name
FROM albums AS a
JOIN photos AS p ON a.id_album= p.album_id
LEFT JOIN photos AS p1 ON p.album_id = p1.album_id
AND p.id_photo < p1.id_photo
WHERE p1.id_photo IS NULL
ORDER BY a.id_album DESC
LIMIT 3
或
SELECT a.album_name, a.id_album, p.id_photo, p.photo_name
FROM albums AS a
JOIN photos AS p ON a.id_album= p.album_id
JOIN (
SELECT album_id , MAX(id_photo) id_photo
FROM photos
GROUP BY album_id
) AS p1 ON p.album_id = p1.album_id
AND p.id_photo = p1.id_photo
ORDER BY a.id_album DESC
LIMIT 3
在查询构建中你可以写成
$this->db->select('a.album_name, a.id_album, p.id_photo, p.photo_name');
$this->db->from('albums AS a');
$this->db->join('photos AS p', 'a.id_album= p.album_id');
$this->db->join('photos AS p1', 'p.album_id = p1.album_id AND p.id_photo < p1.id_photo', 'left');
$this->db->where('p1.id_photo IS NULL', null, false)
$this->db->limit(3);
$this->db->order_by('a.id_album', 'desc');
$query = $this->db->get();
【讨论】:
【参考方案2】:您可能想尝试不同的方法,而不是处理连接:
// first, fetch the 3 latest albums:
$this->db->select('id_album', 'album_name');
$this->db->from('albums');
// ordering by descending ID would give you the lastest ones first
$this->db->order_by('id_album','desc');
$this->db->limit(3);
$query = $this->db->get();
$albums = $query->result();
// now, loop each album and fetch the latest photo
foreach ($albums as $a)
$this->db->select('id_photo', 'album_id', 'photo_name');
$this->db->from('photo');
$this->db->where('album_id', $a->id_album);
// ordering by descending ID should return the lastest photo first
$this->db->order_by('id_photo','desc');
$this->db->limit(1);
$query = $this->db->get();
$a->latest_photo = $query->row(0);
// return the album information for the 3 latest ones, along with the lastest photo for each
return $albums;
返回将是一个看起来很像这样的对象数组:
Array
(
[0] => stdClass Object
(
[id_album] => 0
[album_name] => name of album 0
[latest_photo] => stdClass Object
(
[id_photo] => latest_photo_0
[album_id] => 0
[photo_name] => Some_name_0
)
)
[1] => stdClass Object
(
[id_album] => 1
[album_name] => name of album 1
[latest_photo] => stdClass Object
(
[id_photo] => latest_photo_1
[album_id] => 1
[photo_name] => Some_name_1
)
)
[2] => stdClass Object
(
[id_album] => 2
[album_name] => name of album 2
[latest_photo] => stdClass Object
(
[id_photo] => latest_photo_2
[album_id] => 2
[photo_name] => Some_name_2
)
)
)
是的,与使用单个连接查询相比,您将运行更多的查询,但对性能的影响可以忽略不计,并且您对最终结果保留了更多的控制权,而从 SQL 的角度来看,不会使事情变得不必要地复杂
【讨论】:
毫无疑问,这是一种不同的方法,但它也会产生一个 N+1 查询问题,如此处所述What is the “N+1 selects problem” in ORM (Object-Relational Mapping)? 是的,它确实引入了 N+1 查询问题的一个非常简化的版本并且对性能有影响,但是考虑到它旨在进行非常少量的查询(因为要求是仅获取 3 张专辑),如上所述,它对性能的影响可以忽略不计。我有一些应用程序是故意在更大的范围内完成的(数百次迭代),最终结果仍然在 100 毫秒范围内(受益于非常整洁的结果集)以上是关于在 codeigniter 中显示 2 个具有活动记录的表中的 3 个最新数据的主要内容,如果未能解决你的问题,请参考以下文章