在 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 个最新数据的主要内容,如果未能解决你的问题,请参考以下文章

CodeIgniter:如何使用活动记录将一个列值移动到另一个具有 Where 条件的值

在codeigniter中计算结果

mysql codeigniter 活动记录 m:m 删除

在 codeigniter 中显示具有相同组名的多条记录

使用bootstrap在codeigniter中进行分页

CodeIgniter:如何“突出显示”用户当前所在页面的链接?