多个表上的MYSQL JOIN没有返回任何结果

时间:2013-07-09 11:41:28

标签: php mysql

嗯,让我们看看,只要朋友邮件完成,我的查询工作正常。如果用户没有朋友,则不会返回任何结果,这就是我想要获得的信息......

    $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和子查询方法时,我仍然想描述结果应该是什么样的:

显示:用户帖子发布,用户板上的任何人发布的帖子,在自己的主板上制作的朋友帖子!不是人们在朋友板上发布的帖子。

2 个答案:

答案 0 :(得分:3)

有两个问题:

  1. 朋友需要LEFT JOINLEFT JOIN表示返回连接中第一个表中的所有记录,即使连接中的第二个表中没有找到结果。 您还应该将WHERE子句与friends条件相关的条件放入LEFT JOIN子句中,以便条件出现在连接处。您应该尽可能在联接中使用m.id而不是$myId来消除冗余。
  2. 您的WHERE子句限制性太强(冗余条件)。始终尽可能使用最简单的条件,并在JOIN添加适当的条件,以便更容易阅读。
  3. 示例(编辑以添加来自朋友的帖子):

    $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)

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

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