【问题标题】:Trouble using MySQL select queries使用 MySQL 选择查询时遇到问题
【发布时间】:2014-02-09 19:35:43
【问题描述】:

我有两个表“posts”和“relations”

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

“帖子”

post_id | user_id | privacy

“关系”

rel_id | sender | recipient | status 

这是我想要完成的:

抓取posts表中user_id=relationship表中的receiver的所有post,并跳过relationship表中status为1、postprivacy为2的post。

现在,我还想同时从 user_id = $user_id 的用户表中获取所有帖子

我尝试在查询中使用带有 OR 语句的连接。它不能正常工作。我认为问题在于我在我的加入中设置 p.user_id = r.recipient 并且用户的 id 唯一出现在收件人列中的时候是 SOMEONE ELSE 是否关注(status = 1)或朋友(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

我做错了什么?

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    假设逻辑适合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. 第二个查询仅选择帖子表中的字段。
    2. 第二个查询是比较变量$user_id,而不是硬编码的1(我认为这是原帖中的错字)。
    3. order by 子句不使用表别名。 整体查询中没有p.post_id的定义,仅在子查询中。

    【讨论】:

      【解决方案2】:

      当您使用 UNIONUNION ALL 时,您将合并两个结果集:UNION 两侧的 SELECT 操作的结果集。您问题中的两个结果集不一致:也就是说,它们的列数不同。

      这是因为您使用了SELECT * 而不是SELECT item, item, item。第二个结果集中的SELECT * 包含postsrelations 表的所有列,而只有posts 表的列出现在第一个结果集中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-27
        • 1970-01-01
        相关资源
        最近更新 更多