2013-07-09 67 views
1

好吧,让我们看看,我的查询工作正常,只要一个friendpost完成,但是。如果用户没有朋友,没有结果将返回,而这正是我试图得到一个挂...MYSQL JOIN在多个表上没有返回结果

$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"; 

我希望有人能帮助我,也许我只是盲目的NAO .. 。


编辑 正如史蒂芬帮了我不少,也许有人找到了最后一位失踪:这只是显示了特定用户做出的帖子。即使按照我的理解查询,它也应该会获得朋友在其插件板上发布的帖子。毕竟mid也应该得到friendtables的价值,或者我错了吗?


编辑2 因此,正如我与UNION和子查询方法走到现在,我还是想描述的结果应该是什么样子:

显示:制作等。无论Userposts,帖子由何人在用户板上制作,Friendposts在自己的主板上制作!不是朋友板上的人员发布的帖子。

+2

使用'LEFT JOIN朋友' – 2013-07-09 11:42:42

+0

仍然没有结果,是的应该有一个。 –

回答

3

有2个问题:

  1. 你需要的朋友LEFT JOIN。 A LEFT JOIN表示即使在联接的第二个表中没有找到结果,也会从联接中的第一个表中返回所有记录。 您还应该将与friends有关的WHERE条款条件放入LEFT JOIN子句中,以便条件发生在连接处。您应该尽可能在您的连接中使用m.id而不是$myId以消除冗余。
  2. 您的WHERE子句限制性太强(冗余条件)。始终尽可能使用最简单的条件,并在JOIN上放置尽可能多的条件,以便于阅读。

例(编辑补充来自朋友的帖子,以及):

$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"; 
+1

加法给了我正确的提示,忘了那:),谢谢 - >它在“我在哪里寻找解决方案”,谢谢。 –

+0

伊万,我也对你的where子句做了一些修改。你有太多的条件用户ID –

+0

我离开了2个额外的条件,因为它们是,但添加了m.id = {$ myId},现在它工作正常,感谢提示! –

0

OK,所以最后我结束了使用联盟和子查询......这可能不理想,但如果有人有一个很好的建议什么改善,请给我你的意见!另外,我希望这篇文章能够帮助人们解决类似的问题。

$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";