Mysql
 sql >> Database >  >> RDS >> Mysql

MYSQL JOIN su più tabelle che non restituiscono risultati

Ci sono 2 problemi:

  1. Hai bisogno di un LEFT JOIN sugli amici. Un LEFT JOIN dice di restituire tutti i record dalla prima tabella nel join anche se non ci sono risultati trovati nella seconda tabella nel join. Dovresti anche WHERE condizioni delle clausole relative a friends nel LEFT JOIN clausola, in modo che le condizioni si verifichino al join. Dovresti anche usare m.id ove possibile nei tuoi join invece di $myId per eliminare la ridondanza.
  2. La tua clausola WHERE è troppo restrittiva (condizioni ridondanti). Usa sempre l'insieme di condizioni più semplice possibile e inseriscine il numero appropriato in JOIN quindi sono più facili da leggere.

Esempio (modificato anche per aggiungere post di amici):

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