我有两个表“帖子”和“关系”
为了简洁起见,我省略了表格中的非必要列。
“帖子”
post_id | user_id | privacy
“关系”
rel_id | sender | recipient | status
这就是我想要完成的事情:
抓取posts表中user_id =关系表中收件人的所有帖子,并跳过关系表中状态为1且帖子隐私为2的帖子。
现在,我也想同时从user表中获取user_id = $ user_id
的所有帖子我尝试在查询中使用带有OR语句的连接。它不能正常工作。我认为问题是我在我的连接中设置了p.user_id = r.recipient,并且用户的id在收件人列中的唯一时间是SOMEONE ELSE如果跟随(status = 1)或者friends(status = 2) )与当前用户。
我当前的MySQL查询:
SELECT DISTINCT post_id, user_id, privacy
FROM posts p
JOIN relations r ON p.user_id = r.recipient
AND (r.sender = '".$user_id."')
AND NOT (r.status = 1 AND p.privacy = 2)
OR (p.post_id = '".$user_id."')
ORDER BY p.post_id DESC
所以我认为我需要使用UNION但它根本不起作用。我试过了:
SELECT * FROM posts WHERE user_id = '".$user_id."'
UNION
SELECT *
FROM posts p
JOIN relations r ON p.user_id = r.recipient
AND (r.sender = 1)
AND NOT (r.status = 1 AND p.privacy = 2)
ORDER BY p.post_id DESC
我做错了什么?
答案 0 :(得分:0)
当您使用UNION
或UNION ALL
时,您正在合并两个结果集:SELECT
每一侧的UNION
操作的结果集。您问题中的两个结果集不一致:即,它们具有不同的列数。
这是因为您使用了SELECT *
而不是SELECT item, item, item
。第二个结果集中的SELECT *
包含posts
和relations
表的所有列,而只有posts
表的列出现在第一个结果集中。
答案 1 :(得分:0)
假设逻辑适合union
,我认为这是您想要的查询:
SELECT p.*
FROM posts p
WHERE user_id = '".$user_id."'
UNION
SELECT p.*
FROM posts p JOIN
relations r
ON p.user_id = r.recipient AND r.sender = '".$user_id."' AND
NOT (r.status = 1 AND p.privacy = 2)
ORDER BY post_id DESC;
注意三个变化:
$user_id
进行比较而不是硬编码1
(我认为这是原帖中的拼写错误)。order by
子句不使用表别名。 整体查询中没有p.post_id
的定义,仅在子查询中定义。