我试图运行看起来像这样的查询:
SELECT matches.*, array_agg(match_users.user_id)::int[] AS user_ids FROM "matches"
INNER JOIN "match_users" ON "match_users"."match_id" = "matches"."id"
WHERE (1 = ANY(user_ids))
GROUP BY matches.id
matches
与users
(通过match_users
联接表)存在多对多关系,而我基本上都试图找到所有{{1}给定的matches
属于(在这种情况下,ID为1的用户)。
但我一直收到这个错误:
user
我确定这里有一些简单的东西我在这里失踪了......我需要用别名做些不同的事吗?
编辑:我能用子选择修复吗?以下似乎可行,但我不确定它是否完全符合我的要求而没有更多的虚拟数据和测试:ERROR: column "user_ids" does not exist
LINE 15: AND (1 = ANY(user_ids))
^
********** Error **********
ERROR: column "user_ids" does not exist
我也不确定它会非常高效......如果有足够的行,似乎这将是一个非常多的子选择。
答案 0 :(得分:1)
使用HAVING
子句:
SELECT m.*, array_agg(mu.user_id)::int[] AS user_ids
FROM "matches" m INNER JOIN
"match_users" mu
ON mu."match_id" = m."id"
GROUP BY m.id
HAVING MAX(CASE WHEN mu.user_id = 1 THEN 1 ELSE 0 END) > 0;
换句话说,您不必查看数组以进行检查。您只需查看返回的值即可。