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

Ottenere risultati di query da 2 tabelle db anche quando la seconda tabella non ha voci corrispondenti

O.P. ha detto:

Il problema è che il where La clausola filtra il set di risultati, quindi il tuo test per un req.status di 2 o 5 elimina qualsiasi cosa in cui req.status è nullo perché nessuna riga corrisponde alla tabella applications .

L'ordine delle operazioni generale, teorico (poiché nient'altro che un'implementazione banale farebbe mai qualcosa del genere) per una select affermazione è:

  • Produci il prodotto cartesiano completo di ogni tabella elencata nel from clausola.
  • Filtralo applicando il join specificato criteri e righe eliminate che non superano i test specificati.
  • Applica i criteri di filtro specificati in where clausola, rimuovendo le righe che non superano i test specificati.
  • Ordina i risultati impostati sulle espressioni specificate in group by clausole e partizioni i risultati impostati in gruppi.
  • Comprimi ciascuno di questi gruppi in una singola riga, calcolando il valore di tutte le funzioni aggregate specificate.
  • Rimuovi tutte le colonne dal set di risultati che non sono elencate in select elenco delle colonne delle istruzioni.
  • Ordina questi risultati finali impostati in base alle colonne/espressioni specificate in order by clausola.

Puoi fare una di queste due cose:

  • cambia la tua query per verificare la nullità:

    where...( req.status is null OR req.status in (2,5) )...
    
  • sposta il test su req.status ai criteri di adesione:

    left join requests req on req.app_id =  apps.id
                          and req.uid    =  {$user_id}
                          and req.status in (2,5)