我有两个表“帖子”和“关系”
为了简洁起见,我从表格中省略了非必要的列。
“帖子”
post_id | user_id | privacy
“关系”
rel_id | sender | recipient | status
这是我想要实现的目标:
抓取帖子表中的 user_id = 关系表中的收件人的所有帖子,并跳过关系表中的状态为 1 且帖子隐私为 2 的帖子。
现在,我还想同时从用户表中获取 user_id = $user_id 的所有帖子
我尝试在查询中使用带有 OR 语句的联接。它不起作用。我认为问题是我在加入中设置 p.user_id = r.recipient 并且用户的 id 唯一出现在收件人列中的是当其他人关注(状态 = 1)或 friend (状态 = 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
我做错了什么?
最佳答案
假设逻辑对于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;
注意三个变化:
- 第二个查询仅选择 posts 表中的字段。
- 第二个查询是与变量
$user_id
进行比较,而不是与硬编码的1
进行比较(我认为这是原始帖子中的拼写错误)。 order by
子句不使用表别名。 整体查询中没有p.post_id
定义,仅在子查询中定义。
关于php - 使用 MySQL 选择查询时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21663930/