在 LEFT JOIN 中添加限制会导致不正确的限制金额 return
Adding a limit in LEFT JOIN causes incorrect limit amount to return
我目前正在我的 Postgres 数据库中进行查询,但遇到了我添加到左连接的限制。这是我的查询:
SELECT
t.id AS "teamId",
t.name,
COALESCE(NULLIF(json_agg(Games.games)::TEXT, '[null]'), null)::JSON AS "games"
FROM teams t
LEFT JOIN (
SELECT
tg.team_id,
jsonb_build_object(
'id', tg.id
) AS games
FROM tournament_games tg
ORDER BY tg.total_points DESC
LIMIT 4
)AS Games ON Games.team_id = t.id
WHERE t.tournament_id = 40
GROUP BY t.id
我遇到的问题是 LIMIT 4
只导致 3 场比赛 return 而不是 4 场比赛。当我取消限制时,我的数据库中收到了所有 6 场比赛.
在左联接中应用限制是否有问题?每次我增加限制时,它 returns 比限制状态少一个。 (EX. 限制 5 returns 4 场比赛)
编辑:
取消限制后,return我的数据库中的所有 6 个条目都被删除了。如果将限制设置为 7(超过总条目),则它只有 returns 4 个条目。
这是否意味着 LEFT JOIN 中的查询是 returning 7 但实际 JOIN 正在删除其他查询?
我怀疑你想要每队 4 场比赛。为此,我建议使用子查询或横向连接:
select t.id as teamid, t.name, tg.games
from teams t
left join lateral (
select jsonb_agg(jsonb_build_object('id', tg.id)) as games
from (
select tg.*
from tournament_games tg
where tg.team_id = t.id
order by tg.total_points desc
limit 4
) tg
) tg on true
where t.tournament_id = 40
我不确定您为什么要将 json 对象转换为文本 - 这似乎没有多大帮助,所以我将其分开。
我目前正在我的 Postgres 数据库中进行查询,但遇到了我添加到左连接的限制。这是我的查询:
SELECT
t.id AS "teamId",
t.name,
COALESCE(NULLIF(json_agg(Games.games)::TEXT, '[null]'), null)::JSON AS "games"
FROM teams t
LEFT JOIN (
SELECT
tg.team_id,
jsonb_build_object(
'id', tg.id
) AS games
FROM tournament_games tg
ORDER BY tg.total_points DESC
LIMIT 4
)AS Games ON Games.team_id = t.id
WHERE t.tournament_id = 40
GROUP BY t.id
我遇到的问题是 LIMIT 4
只导致 3 场比赛 return 而不是 4 场比赛。当我取消限制时,我的数据库中收到了所有 6 场比赛.
在左联接中应用限制是否有问题?每次我增加限制时,它 returns 比限制状态少一个。 (EX. 限制 5 returns 4 场比赛)
编辑:
取消限制后,return我的数据库中的所有 6 个条目都被删除了。如果将限制设置为 7(超过总条目),则它只有 returns 4 个条目。
这是否意味着 LEFT JOIN 中的查询是 returning 7 但实际 JOIN 正在删除其他查询?
我怀疑你想要每队 4 场比赛。为此,我建议使用子查询或横向连接:
select t.id as teamid, t.name, tg.games
from teams t
left join lateral (
select jsonb_agg(jsonb_build_object('id', tg.id)) as games
from (
select tg.*
from tournament_games tg
where tg.team_id = t.id
order by tg.total_points desc
limit 4
) tg
) tg on true
where t.tournament_id = 40
我不确定您为什么要将 json 对象转换为文本 - 这似乎没有多大帮助,所以我将其分开。