Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL SELECT WHERE IN LIST et NOT IN LIST dans le même SQL

générer une instruction de jointure externe afin d'obtenir :

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

où ids est une sous-requête énumérant toutes les valeurs, quelque chose comme ceci :

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

assurez-vous de sélectionner ids.id , pas table_live.id . De cette façon, les identifiants apparaîtront toujours, et le moderation_date uniquement si la ligne correspondante existe dans table_live.

Une autre approche consisterait à conserver la requête telle que vous l'aviez, à stocker le résultat dans un tableau, puis à fusionner les tableaux dans php afin de conserver toutes les clés et de ne remplir les valeurs que lorsque la clé correspond dans les deux tableaux.

Je ne sais pas vraiment quel type de bibliothèque db vous utilisez, donc je ne sais pas comment obtenir un tableau du jeu de résultats, mais supposons que vous auriez stocké les lignes dans un tableau php, en utilisant une représentation sous forme de chaîne de l'id comme clé, et la date comme valeur, alors ce code devrait faire l'affaire :

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

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