sql >> Database >  >> RDS >> Mysql

MySQL SELECTEER WHERE IN LIST en NOT IN LIST in dezelfde SQL

genereer een outer join-instructie zodat u het volgende krijgt:

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

waar ids een subquery is die alle waarden opsomt, zoiets als dit:

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

zorg ervoor dat u ids.id selecteert , niet table_live.id . Op die manier worden de ID's altijd weergegeven en de moderation_date alleen als de bijbehorende rij in table_live bestaat.

Een andere benadering zou zijn om de query te houden zoals je hem had, het resultaat op te slaan in een array en vervolgens de arrays samen te voegen in php zodat je alle sleutels behoudt en de waarden alleen in te vullen waar de sleutel in beide arrays overeenkomt.

Ik weet niet echt wat voor soort db-bibliotheek je gebruikt, dus ik weet niet hoe ik een array van de resultatenset moet verkrijgen, maar stel dat je de rijen in een php-array zou hebben opgeslagen, met behulp van een tekenreeksrepresentatie van de id als sleutel, en de datum als waarde, dan zou deze code het moeten doen:

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

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




  1. Automatische failover voor TimescaleDB bereiken

  2. Zijn kolom- en tabelnaam hoofdlettergevoelig in MySQL?

  3. Een PostgreSQL-query exporteren naar een csv-bestand met Python

  4. postgresql - tel (geen null-waarden) van elke kolom in een tabel