首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL连接在多个表上,不返回任何结果

MYSQL连接在多个表上,不返回任何结果
EN

Stack Overflow用户
提问于 2013-07-09 11:41:27
回答 2查看 1.5K关注 0票数 2

好吧,让我们看看,我的查询工作良好,只要完成一个友好的帖子,然而。如果用户没有朋友,就不会返回结果,这就是我想要得到的.

代码语言:javascript
复制
    $query = "SELECT DISTINCT m.id, p.byuser, p.`newpost`, p.`id`, p.`postdate`
    FROM users m
    JOIN pinnwand p 
      ON m.id = p.byuser
    JOIN friends f 
      ON f.`userid` = m.id OR f.`friendid` = m.id
    WHERE (f.`userid` = $myId OR f.`friendid`= $myId)
      AND (p.`touser` = p.`byuser` OR p.`touser` = $myId)
      AND p.`publicp` < 3 
      AND p.`typ` = 2
    ORDER BY p.id DESC LIMIT $limit, 10";

我希望有人能帮我,也许我只是瞎了眼.

编辑作为史蒂文帮助了我很多,也许有人发现了最后一点缺失:它只是显示了为特定用户制作的帖子。即使就我所理解的问题,它也应该得到朋友的帖子在他们的针板上以及?毕竟,m.id也应该得到友好值,还是我错了?

编辑2 --当我现在使用UNION和Subquery方法时,我仍然想描述结果应该是什么样子:

展示:用户在任何地方发布,由谁在用户板上发布,友谊帖子在自己的版面上!而不是人们在朋友论坛上发布的帖子。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-09 11:45:41

有两个问题:

  1. 你需要一个朋友的LEFT JOINLEFT JOIN要求返回连接中第一个表中的所有记录,即使在联接中的第二个表中没有找到结果。您还应该将与friends相关的friends子句条件转换为LEFT JOIN子句,以便条件出现在LEFT JOIN子句中。您还应该尽可能在联接中使用m.id,而不是$myId,以消除冗余。
  2. WHERE子句限制性太强(冗余条件)。始终使用最简单的条件集,并将尽可能多的条件放在JOIN上,这样就更容易阅读了。

示例(编辑以添加朋友的帖子):

代码语言:javascript
复制
$query = "SELECT DISTINCT `u`.`id`, `p`.`byuser`, `p`.`newpost`, `p`.`id`, `p`.`postdate`
          FROM `users` AS `u`
          LEFT JOIN `friends` AS `f` 
              ON `f`.`userid` = `u`.`id` 
              OR `f`.`friendid` = `u`.`id`
          JOIN `pinnwand` AS `p` 
              /* This will get all posts made by the user */
              ON `p`.`byuser` = `u`.`id` 
              /* This will get all posts made TO the user by friends */
              OR (`p`.`byuser` IN (`f`.`userid`, `f`.`friendid`)
                  AND `p`.`touser` = `u`.`id`)
          WHERE `u`.`id` = {$myId}
              AND `p`.`publicp` < 3 
              AND `p`.`typ` = 2
          ORDER BY `p`.`id` DESC 
          LIMIT {$limit}, 10";
票数 3
EN

Stack Overflow用户

发布于 2013-07-09 14:05:50

最后我用了一个Union和一个子查询.这可能是次优,但如果有人有好的建议,改进,请给我你的意见!另外,我希望这篇文章能帮助那些有类似问题的人。

代码语言:javascript
复制
    $query = "SELECT DISTINCT `p`.`byuser`, `p`.`newpost`, `p`.`id`, `p`.`postdate`
    FROM `pinnwand` AS `p`
    JOIN `users` AS `u` ON `u`.`id` = `p`.`byuser`
    LEFT JOIN `friends` AS `f` ON (`f`.`friendid` = `u`.`id` OR `f`.`userid` = `u`.`id`)
    WHERE (f.userid = {$myId} OR f.friendid = {$myId})
        AND `p`.`publicp` < 3 
        AND `p`.`typ` = 2
        AND `p`.`byuser` <> {$myId}
    UNION ALL
    SELECT DISTINCT `p`.`byuser`, `p`.`newpost`, `p`.`id`, `p`.`postdate`
    FROM `pinwand` AS `p`
    JOIN `users` AS `u` ON `u`.id = `p`.`byuser`
        WHERE `u`.`id` = {$myId}
        AND `p`.`publicp` < 3 
        AND `p`.`typ` = 2
    ORDER BY `postdate` DESC
    LIMIT 0,10";
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17547348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档