snippetsqlMinor
How filter Not NULL rows after multiple LEFT JOIN?
Viewed 0 times
afterrowsleftnulljoinfiltermultiplehownot
Problem
I want to JOIN a base table with another 23 tables. But as I want to join one with another tables, I have to use LEFT JOIN. My query sample:
The result of that query is like this:
```
+----------+------------+---------+-------------+-------------+-------------+------------------------------------+
| notif_id | da | uft_id | un | tr_n | cm_tx | av_ul |
+----------+------------+---------+-------------+-------------+-------------+------------------------------------+
| 10 | 1542866579 | 1799477 | NULL | NULL | NULL | NULL
SELECT notif_dest_user.notif_id,
notif_all.da,
COALESCE(notif_trick_like.uft_id, notif_trick_comment.uft_id) AS uft_id,
COALESCE(like_users.un, trickComment_users.un) AS un,
COALESCE(like_tricks.tr_n, trickComment_tricks.tr_n) AS tr_n,
trickComment_userForTricks.cm_tx,
COALESCE(trickComment_users.av_ul,like_users.av_ul) AS av_ul
FROM notif_dest_user
LEFT JOIN notif_all ON notif_all.notif_id = notif_dest_user.notif_id
LEFT JOIN notif_trick_like ON notif_dest_user.notif_id = notif_trick_like.notif_id
LEFT JOIN user_for_tricks like_userForTricks ON notif_trick_like.uft_id = like_userForTricks.uft_id
LEFT JOIN tricks like_tricks ON like_userForTricks.tr_id = like_tricks.tr_id
LEFT JOIN users like_users ON like_userForTricks.u_id = like_users.u_id
LEFT JOIN notif_trick_comment ON notif_trick_comment.notif_id = notif_dest_user.notif_id
LEFT JOIN user_for_tricks trickComment_userForTricks
on trickComment_userForTricks.uft_id = notif_trick_comment.uft_id
LEFT JOIN users trickComment_users ON trickComment_users.u_id = trickComment_userForTricks.u_id
LEFT JOIN tricks trickComment_tricks ON trickComment_tricks.tr_id = trickComment_userForTricks.tr_id
where notif_dest_user.dest_u_id = 42
limit 10;The result of that query is like this:
```
+----------+------------+---------+-------------+-------------+-------------+------------------------------------+
| notif_id | da | uft_id | un | tr_n | cm_tx | av_ul |
+----------+------------+---------+-------------+-------------+-------------+------------------------------------+
| 10 | 1542866579 | 1799477 | NULL | NULL | NULL | NULL
Solution
Two options:
1) If you want to filter out rows that have no match in the right table, skip the
2) If you want to filter out rows that have all expressions evaluated to NULL, use regular WHERE clause, like:
1) If you want to filter out rows that have no match in the right table, skip the
LEFT keyword and use the regular (inner) join.2) If you want to filter out rows that have all expressions evaluated to NULL, use regular WHERE clause, like:
SELECT ...
FROM ...
WHERE COALESCE(notif_trick_like.uft_id, notif_trick_comment.uft_id) IS NOT NULL
OR COALESCE(like_users.un, trickComment_users.un) IS NOT NULL
OR COALESCE(like_tricks.tr_n, trickComment_tricks.tr_n) IS NOT NULL
OR trickComment_userForTricks.cm_tx IS NOT NULL
OR COALESCE(trickComment_users.av_ul,like_users.av_ul) IS NOT NULLCode Snippets
SELECT ...
FROM ...
WHERE COALESCE(notif_trick_like.uft_id, notif_trick_comment.uft_id) IS NOT NULL
OR COALESCE(like_users.un, trickComment_users.un) IS NOT NULL
OR COALESCE(like_tricks.tr_n, trickComment_tricks.tr_n) IS NOT NULL
OR trickComment_userForTricks.cm_tx IS NOT NULL
OR COALESCE(trickComment_users.av_ul,like_users.av_ul) IS NOT NULLContext
StackExchange Database Administrators Q#223363, answer score: 3
Revisions (0)
No revisions yet.