给出以下查询......
SELECT DISTINCT *
FROM PAS_Post
WHERE post_user_id = 21
GROUP BY post_post_id
UNION
SELECT DISTINCT PAS_Post.*
FROM PAS_Follow LEFT JOIN PAS_Post ON (
PAS_Follow.folw_followed_user_id = PAS_Post.post_user_id
)
WHERE PAS_Follow.folw_follower_user_id = 21
GROUP BY post_post_id
ORDER BY post_posted_date DESC
我总是在结果中得到一行只是NULL,不幸的是我需要在数据中保留一些NULL值,因为Post表(PAS_Post)包含不同类型的信息。
任何人都可以引导我朝正确的方向摆脱这个空行。
我不想或不需要最后一行
答案 0 :(得分:2)
您在UNION
的第二部分使用(左)外连接,因此任何不满足连接条件的情况都会产生连接左侧表格中的数据({ {1}}),但在联接右侧表格的每一列中PAS_Follow
(NULL
);后面只选择后一个表中的列会导致您观察到的PAS_Post
行。因此,最简单的解决方案是使用内部联接(完全排除不符合联接条件的记录)。
但是,在您的情况下,通过在连接表上的过滤器中使用两个可能的条件而不是NULL
来显示您的查询可以大大简化:
UNION
我假设SELECT p.*
FROM PAS_Post AS p
JOIN PAS_Follow AS f ON f.folw_followed_user_id = p.post_user_id
WHERE p.post_user_id = 21
OR f.folw_follower_user_id = 21
ORDER BY p.post_posted_date DESC
是GROUP BY
表中的主键(或至少是post_post_id
),我排除了UNIQUE
子句。如果这个假设不正确,你可能想重新引入它 - 但要注意MySQL将不确定地选择将从每个组返回的值。