I'm relatively new to sql and have been trying to get a pretty complex query (for me) to work for a while, but I've kept on getting duplicate values within each column using node postgres. Through this query I am trying to track user info, plan info and email info on a dashboard. Before we get to the query, here are the tables -
USER TABLE (u) - keep track of user info
+----+-------+---------+-------------+----------+
| id | first | last | email | password |
+----+-------+---------+-------------+----------+
| 1 | joe | smith | j@gmail.com | 1234 |
| 2 | mary | johnson | m@gmail.com | 3445 |
| 3 | harry | gold | h@gmail.com | 4345 |
+----+-------+---------+-------------+----------+
PLANS TABLE (p) - plans that users can make with their friends
+----+--------------+-----------+------------+------+--------+-----------+---------+------+
| id | experienceid | hostid(u) | guestid(u) | date | time | paidid(u) | groupid | newp |
+----+--------------+-----------+------------+------+--------+-----------+---------+------+
| 33 | 1 | 1 | [1,2,3] | 4/20 | 8:00pm | [1,2] | 1 | true |
+----+--------------+-----------+------------+------+--------+-----------+---------+------+
EMAIL TABLE (e) - keep track of messages I am sending to the users based on the plan they are a part of
+-------------+-----------+---------+----------+
| email(u) | planid(p) | confirm | reminder |
+-------------+-----------+---------+----------+
| j@gmail.com | 33 | null | null |
| m@gmail.com | 33 | true | false |
| h@gmail.com | 33 | true | false |
+-------------+-----------+---------+----------+
Now for the query what I am trying to do is combine all three tables to get this output -
+-------+---------------+---------------------------+---------+---------+------------+---------------+---------------+
| id(p) | hostname(u+p) | paidguests(u+p) | time(p) | newp(p) | groupid(p) | reminder(e) | confirm(e) |
+-------+---------------+---------------------------+---------+---------+------------+---------------+---------------+
| 33 | joe smith | [joe smith, mary johnson] | 8:00pm | true | 1 | [true, false] | [true, false] |
+-------+---------------+---------------------------+---------+---------+------------+---------------+---------------+
Now where I left off in the query, I almost got it to work, but I kept getting duplicate values where it would look like this -
+-------+---------------+----------------------------------------------------+---------+---------+------------+----------------------------+---------------------------+
| id(p) | hostname(u+p) | paidguests(u+p) | time(p) | newp(p) | groupid(p) | reminder(e) | confirm(e) |
+-------+---------------+----------------------------------------------------+---------+---------+------------+----------------------------+---------------------------+
| 33 | joe smith | [joe smith, mary johnson, joe smith, mary johnson] | 8:00pm | true | 1 | [true, false, true, false] | [true, false, true false] |
+-------+---------------+----------------------------------------------------+---------+---------+------------+----------------------------+---------------------------+
Now I don't really care about order for the confirm and reminder columns relative to the paidguests(u+p) column, as long as the right data is in there and not duplicated. Here is the query I had as it stands -
SELECT p.id,
Concat(u.first, ' ', u.last) AS hostname,
Array_agg(Concat(us.first, ' ', us.last)) AS paidguests,
p.time,
p.groupid,
p.newp,
Array_agg(e.confirm) AS confirm,
Array_agg(e.reminder) AS reminder
FROM plans p
CROSS JOIN Unnest(p.paidid) AS allguests
LEFT JOIN users us
ON allguests = us.id
LEFT JOIN emails e
ON p.id = e.planid
LEFT JOIN users u
ON p.hostid = u.id
WHERE p.experienceid = $1
AND p.date = $2
GROUP BY p.id,
u.first,
u.last,
p.paidid,
p.time,
p.groupid,
p.newp,
confirm,
reminder
ORDER BY Array_length(p.paidid, 1) DESC
So essentially just looking to get the table right without the duplicates. It was working before I added the join to the email table, but not entirely sure why its duplicating.
Hope I was thorough in the explanation. If not, please let me know what I can clarify! Thanks so much :)