You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP(Laravel)/PostgreSQL中如何不将username加入GROUP BY即可查询该字段

方案1:使用聚合函数包裹username字段(兼容性最好)

PostgreSQL 中如果某字段和GROUP BY的字段存在唯一对应关系(比如user_id和username,每个id只会对应一个用户名),可以用聚合函数包裹该字段,不需要将其加入GROUP BY子句。
你可以将原来的单表关联拆分为两次分别关联对话双方的用户表,避免OR关联导致的数据重复,修改后的SQL如下:

SELECT 
    user1_id, 
    user2_id,
    MAX(u1.username) AS user1_username,
    MAX(u2.username) AS user2_username
FROM sessions
LEFT JOIN users u1 ON sessions.user1_id = u1.id
LEFT JOIN users u2 ON sessions.user2_id = u2.id
WHERE sessions.user1_id = 1 OR sessions.user2_id = 1
GROUP BY user1_id, user2_id

对应的Laravel查询构造器写法:

use Illuminate\Support\Facades\DB;

$sessionList = DB::table('sessions')
    ->select(
        'user1_id',
        'user2_id',
        DB::raw('MAX(u1.username) as user1_username'),
        DB::raw('MAX(u2.username) as user2_username')
    )
    ->leftJoin('users as u1', 'sessions.user1_id', '=', 'u1.id')
    ->leftJoin('users as u2', 'sessions.user2_id', '=', 'u2.id')
    ->where(function ($query) {
        $query->where('sessions.user1_id', 1)
              ->orWhere('sessions.user2_id', 1);
    })
    ->groupBy('user1_id', 'user2_id')
    ->get();

方案2:使用PostgreSQL专属DISTINCT ON语法(更简洁)

PostgreSQL 支持DISTINCT ON语法,可以直接返回指定字段组合的唯一值,不需要写GROUP BY,写法更简单:

SELECT DISTINCT ON (user1_id, user2_id)
    user1_id,
    user2_id,
    u1.username AS user1_username,
    u2.username AS user2_username
FROM sessions
LEFT JOIN users u1 ON sessions.user1_id = u1.id
LEFT JOIN users u2 ON sessions.user2_id = u2.id
WHERE sessions.user1_id = 1 OR sessions.user2_id = 1

另外你原来的SQL同时写了DISTINCT和GROUP BY,二者作用重复,去掉其中一个即可。

内容的提问来源于stack exchange,提问作者user16675203

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:18:01