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

MySQL SELECT WHERE IN LIST e NOT IN LIST nello stesso SQL

genera un'istruzione outer join in modo da ottenere:

SELECT ids.id, table_live.moderation_date
FROM (select 1 id union all select 2 union all ....) ids
LEFT JOIN table_live
ON ids.id = table_live.id

dove ids è una sottoquery che enumera tutti i valori, qualcosa del genere:

$ids = '1,2,3,4,5'
$subquery = 'select '.str_replace(',', ' id union all select ', $ids).''
$sql = "SELECT ids.id, table_live.moderation_date
FROM ($subquery) ids
LEFT JOIN table_live
ON ids.id = table_live.id"

assicurati di selezionare ids.id , non table_live.id . In questo modo, gli ID verranno sempre visualizzati e moderation_date solo se la riga corrispondente esiste in table_live.

Un altro approccio sarebbe quello di mantenere la query così com'era, memorizzare il risultato in un array e quindi unire gli array in php in modo da conservare tutte le chiavi e compilare i valori solo dove la chiave corrisponde in entrambi gli array.

Non sono davvero sicuro del tipo di libreria db che stai utilizzando, quindi non so come ottenere un array del set di risultati, ma supponiamo che avresti archiviato le righe in un array php, utilizzando una rappresentazione di stringa dell'id come chiave e la data come valore, quindi questo codice dovrebbe fare il trucco:

$items = array(
    '1' => NULL
,   '2' => NULL
,   ...
); 
//note: use string keys in order to merge!!
$result = array_merge($items, $resultset);

vedere:http://php.net/manual/en/function.array -merge.php