I would like to make multiple joins in one query, I have four tables for that with the following structure:
Table 1 fields, t1: did (int), finished (datetime), userid (int)
Table 2 fields, t2: userid (int), name
Table 3 fields, t3: blid (int), did (int), count (int), btid(int)
Table 4 fields, t4: btid(int), denom (int)
I want to make a query where I would get all fields of t1
except for that one joined with t2
in that case I would like to show t2.name
when t1.userid = t2.userid
This is fair simple:
select t1.did, t1.finished, t2.name, t2.userid from t1 inner join on t1.userid=t2.userid
But I also want to add a column composed by the following query:
select sum(t3.count*t4.denom) from t3 inner join t4 on t3.btid=t4.btid
Only when t3.did=t1.did
I don’t know if it would be an outer join or otherwise, but I want to add the previous query as a column in the first query and it would be something like:
t1.did, t1.finished, t2.name, t2.userid, “total”?
The real-world problem is that users make money deposits t1
users information are held in t2
. The amount deposited is described in t3
for every deposit t1.did
and related denominations of each deposit breakdown, in t3
are described in t4
.
Advertisement
Answer
You might find this easiest as a correlated subquery:
select t1.did, t1.finished, t2.name, t2.userid, (select sum(t3.count * t4.denom) from t3 inner join t4 on t3.btid = t4.btid where t3.did = t1.did ) as value from t1 inner join t2 on t1.userid = t2.userid;
For this version, you want indexes on t3(did, btid, count)
and t4(btid, denom)
.
You can also phrase this as a join
and group by
:
select t1.did, t1.finished, t2.name, t2.userid, sum(t3.count * t4.denom) from t1 inner join t2 on t1.userid = t2.userid left join t3 on t3.did = t1.did left join t4 on t3.btid = t4.btid group by t1.did, t1.finished, t2.name, t2.userid;