Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MYSQL JOIN für mehrere Tabellen, die keine Ergebnisse zurückgeben

Es gibt 2 Probleme:

  1. Du brauchst einen LEFT JOIN auf Freunde. Ein LEFT JOIN besagt, dass alle Datensätze aus der ersten Tabelle im Join zurückgegeben werden sollen, auch wenn in der zweiten Tabelle im Join keine Ergebnisse gefunden werden. Sie sollten auch WHERE angeben Klauselbedingungen in Bezug auf friends in den LEFT JOIN -Klausel, sodass die Bedingungen beim Join auftreten. Sie sollten auch m.id verwenden wo immer möglich in Ihren Joins anstelle von $myId um Redundanzen zu eliminieren.
  2. Ihre WHERE-Klausel ist zu restriktiv (redundante Bedingungen). Verwenden Sie immer den einfachsten Satz von Bedingungen und geben Sie so viele wie nötig beim JOIN ein damit sie leichter zu lesen sind.

Beispiel (bearbeitet, um auch Beiträge von Freunden hinzuzufügen):

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