MYSQL JOIN on multiple tables returning no results

后端 未结 2 939
别跟我提以往
别跟我提以往 2021-01-23 04:06

Well let\'s see, the query I have is working fine, as soon as a friendpost is done, however. If the user has no friends, no result will be returned, and that\'s what I am trying

相关标签:
2条回答
  • 2021-01-23 05:03

    There are 2 problems:

    1. You need a LEFT JOIN on friends. A LEFT JOIN says to return all records from the first table in the join even if there are no results found in the second table in the join. You also should the WHERE clause conditions relating to friends into the LEFT JOIN clause, so that the conditions occur at the join. You should also be using m.id wherever possible in your joins instead of $myId to eliminate redundancy.
    2. Your WHERE clause is too restrictive (redundant conditions). Always use the simplest set of conditions possible, and put as many as appropriate at the JOIN so they are easier to read.

    Example (Edited to add posts from friends, as well):

    $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";
    
    0 讨论(0)
  • 2021-01-23 05:03

    OK, so in the end i ended up using an Union and a subquery... It's probably suboptimal, but if somebody has a good suggestion what to improve, please give me your opinion! Otherwhise I hope that this post will help people with simmilar problems.

        $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 讨论(0)
提交回复
热议问题