php - 使用 MySQL 选择查询时出现问题

标签 php mysql sql

我有两个表“帖子”和“关系”

为了简洁起见,我从表格中省略了非必要的列。

“帖子”

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;

注意三个变化:

  1. 第二个查询仅选择 posts 表中的字段。
  2. 第二个查询是与变量 $user_id 进行比较,而不是与硬编码的 1 进行比较(我认为这是原始帖子中的拼写错误)。
  3. order by 子句不使用表别名。 整体查询中没有 p.post_id 定义,仅在子查询中定义。

关于php - 使用 MySQL 选择查询时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21663930/

相关文章:

mysql - HTML5页面用node.js连接mysql数据库

sql - INSERT [...] ON CONFLICT 可以用于外键违规吗?

php - 检查 MySQL 中单行字符串中是否存在数字

php - 当 html 代码作为电子邮件发送时,事情无法正常工作

PHP-fputcsv : put JSON values retrieved from MySQL field in separate columns

mysql - 使用闭包表对分层数据进行分页 (MySQL)

mysql - SQL 查询 FROM 变量表

php - 我将如何在不使用 javascript 的情况下跟踪 flash 视频?

mysql - 关于使用电子邮件地址作为主键的想法

java - 基于 MySql/GigaSpaces/Netapp 的分布式锁服务