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

MySQL SELECT WHERE IN LIST und NOT IN LIST in derselben SQL

Generieren Sie eine Outer-Join-Anweisung, sodass Sie Folgendes erhalten:

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

wobei ids eine Unterabfrage ist, die alle Werte auflistet, etwa so:

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

Achten Sie darauf, ids.id auszuwählen , nicht table_live.id . Auf diese Weise werden die IDs immer angezeigt und das moderation_date nur, wenn die entsprechende Zeile in table_live existiert.

Ein anderer Ansatz wäre, die Abfrage so zu lassen, wie Sie sie hatten, das Ergebnis in einem Array zu speichern und dann die Arrays in PHP zusammenzuführen, sodass Sie alle Schlüssel behalten, und die Werte nur dort einzugeben, wo der Schlüssel in beiden Arrays übereinstimmt.

Ich bin mir nicht sicher, welche Art von DB-Bibliothek Sie verwenden, daher weiß ich nicht, wie Sie ein Array der Ergebnismenge erhalten, aber nehmen Sie an, Sie hätten die Zeilen in einem PHP-Array gespeichert und eine Zeichenfolgendarstellung der ID als verwendet Schlüssel und das Datum als Wert, dann sollte dieser Code ausreichen:

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

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