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
相关产品推荐
相关产品推荐

