麻烦使用MySQL选择查询

时间:2014-02-09 19:35:44

标签: php mysql sql

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

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

“帖子”

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

我做错了什么?

2 个答案:

答案 0 :(得分:0)

当您使用UNIONUNION ALL时,您正在合并两个结果集:SELECT每一侧的UNION操作的结果集。您问题中的两个结果集不一致:即,它们具有不同的列数。

这是因为您使用了SELECT *而不是SELECT item, item, item。第二个结果集中的SELECT *包含postsrelations表的所有列,而只有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;

注意三个变化:

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