【问题标题】:MYSQL JOIN on multiple tables returning no results多个表上的 MYSQL JOIN 不返回结果
【发布时间】:2013-07-09 11:41:27
【问题描述】:

好吧,让我们看看,我的查询工作正常,但是一旦朋友发布完成。如果用户没有朋友,则不会返回任何结果,这就是我想要掌握的...

    $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视而不见……


编辑 由于 Steven 帮了我很多忙,也许有人发现最后一点缺失:它只是显示为特定用户发布的帖子。即使我理解查询它也应该得到朋友在他们的pinboard上发布的帖子?毕竟m.id 也应该得到friendtables 值,还是我错了?


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

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

【问题讨论】:

  • 使用LEFT JOIN friends
  • 仍然没有结果,是的,应该有一个。

标签: php mysql


【解决方案1】:

有2个问题:

  1. 您需要在朋友中使用LEFT JOINLEFT 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";

【讨论】:

  • 加法给了我正确的提示,忘记了:),谢谢->它在我应该寻找解决方案的“哪里”,谢谢。
  • Ivan,我也对你的 where 子句做了一些修改。您的用户 ID 条件过多
  • 我保留了 2 个额外的条件,但添加了 m.id = {$myId},现在它工作正常,感谢提示!
  • 将检查您编辑的解决方案的性能,非常感谢您无论如何都会得到“答复”:)
  • 伊万。您应该摆脱冗余条件,因为它们只会减慢您的查询速度。试试我逐字提供的答案。另外,记下我所做的其他调整(例如格式化)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-06-29
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    相关资源
    最近更新 更多