每次用户登录时都会运行以下查询以获取相关数据
import scala.collection.immutable
def sumToEither(xs: immutable.Seq[Double]): Either[String, Double] = {
@annotation.tailrec
def go(ys: immutable.Seq[Double], acc: Double): Double =
if (ys.isEmpty || acc.isInfinite || acc.isNaN) acc
else go(ys.tail, ys.head + acc)
go(xs, 0.0) match {
case x if x.isInfinite => Left("overflow")
case x if x.isNaN => Left("NaN")
case x => Right(x)
}
}
假设我有2个用户 -
用户1已加入项目(accounts_projects表) - >他得到以下输出
SELECT ac.username,ac.password,
(array_agg(json_build_object('message',pm.message,'username',pm.username,'message_id',pm.message_id)))[0:10] AS messages,
p.project_name,p.project_id
FROM account ac,
LATERAL(SELECT * FROM accounts_projects WHERE ac.user_id = accounts_projects.account_id) ap,
LATERAL(SELECT * FROM project_messages WHERE ap.project_id = project_messages.project_id ORDER BY project_messages.message_id) pm,
LATERAL(SELECT * FROM project WHERE project.project_id = ap.project_id) p
WHERE ac.username=$1
GROUP BY p.project_name,p.project_id,ac.user_id;
但是,如果新用户不属于accounts_projects。 postgres返回一个空行。即只需获取ac.user_id&密码基于用户名和其他列的空值?
无论如何,如果没有找到数据,我可以将postgres发送到忽略或为横向联接返回null吗?理想情况下,它只应该获取ac.username和ac.password。
它看起来像一个简单的LEFT JOIN应该做的伎俩。我尝试像这样更新查询
username: 'kannaj',
projects:
[ { project_name: 'Machine Learning with Python',
messages: [Object],
project_id: 1 },
{ project_name: 'Beethoven with react',
messages: [Object],
project_id: 3 },
{ project_name: 'Football with Javascript',
messages: [Object],
project_id: 2 } ] }
但我收到以下错误
LEFT JOIN LATERAL(SELECT * FROM accounts_projects WHERE ac.user_id = accounts_projects.account_id) ap,
LEFT JOIN LATERAL(SELECT * FROM project_messages WHERE ap.project_id = project_messages.project_id ORDER BY project_messages.message_id) pm,
LEFT JOIN LATERAL(SELECT * FROM project WHERE project.project_id = ap.project_id) p
答案 0 :(得分:2)
像往常一样,JOIN应该具有连接条件:“加入<表达式> on< join condition>”抱怨可能是“ON TRUE”
尝试:
SELECT ac.username,ac.password,
(array_agg(json_build_object('message',pm.message,'username',pm.username,'message_id',pm.message_id)))[0:10] AS messages,
p.project_name,p.project_id
FROM account ac
LEFT JOIN LATERAL(SELECT * FROM accounts_projects WHERE ac.user_id = accounts_projects.account_id) ap ON TRUE
LEFT JOIN LATERAL(SELECT * FROM project_messages WHERE ap.project_id = project_messages.project_id ORDER BY project_messages.message_id) pm ON TRUE
LEFT JOIN LATERAL(SELECT * FROM project WHERE project.project_id = ap.project_id) p ON TRUE
WHERE ac.username=$1
GROUP BY p.project_name,p.project_id,ac.user_id;