使用knex将连接限制为一行

时间:2018-03-28 18:33:01

标签: greatest-n-per-group knex.js

我正在尝试使用连接从两个表中获取数据。问题是forum_posts将包含几个具有相同thread_id的项目。我只想通过id或创建日期来获得第一个。

function getByGroup(groupId) {
    return knex('forum_threads')
        .select('forum_threads.id', 'forum_threads.updated_at', 'forum_posts.content')
        .where('forum_threads.group_id', '=', groupId)
        .leftJoin('forum_posts', function() {
            this.on('forum_posts.thread_id', '=', 'forum_threads.id');
        })
        .orderBy('updated_at', 'desc')
        .then(function(threads) {
            return threads;
        });
}

我想在联接中添加限制(1)或分钟,但不完全确定如何操作。

1 个答案:

答案 0 :(得分:2)

您需要在左连接条件中添加如下过滤器:

.andOn('forum_posts.created_at', '=', knex.raw("(select min(created_at) from forum_posts where forum_posts.thread_id = forum_threads.id)"))

如果论坛帖子记录({1}}具有最低updated_at值,则表示要包含论坛帖子记录(作为左连接匹配)。

完整的代码。以下代码未经过测试,但我在一段代码中测试了上述代码段。

id

干杯!

PS:你没有问过,但是在调试Knex时我觉得非常有帮助的是function getByGroup(groupId) { return knex('forum_threads') .select('forum_threads.id', 'forum_threads.updated_at', 'forum_posts.content') .where('forum_threads.group_id', '=', groupId) .leftJoin('forum_posts', function() { this.on('forum_posts.thread_id', '=', 'forum_threads.id') /* The new line here */ .andOn('forum_posts.created_at', '=', knex.raw("(select min(created_at) from forum_posts where forum_posts.thread_id = forum_threads.id)")) }) .orderBy('updated_at', 'desc') .then(function(threads) { return threads; }); } 查询报告条款:

.on()