sql >> Databáze >  >> RDS >> Mysql

MySQL SELECT WHERE IN LIST a NOT IN LIST ve stejném SQL

vygenerujte příkaz vnějšího spojení, takže získáte:

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

kde ids je poddotaz s výčtem všech hodnot, něco jako toto:

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

nezapomeňte vybrat ids.id , nikoli table_live.id . Tímto způsobem se ID vždy zobrazí a moderation_date pouze v případě, že odpovídající řádek v table_live existuje.

Dalším přístupem by bylo ponechat dotaz tak, jak jste jej měli, uložit výsledek do pole a poté sloučit pole v php, abyste zachovali všechny klíče, a vyplnit hodnoty pouze tam, kde se klíč shoduje v obou polích.

Nejsem si opravdu jistý, jaký druh knihovny db používáte, takže nevím, jak získat pole sady výsledků, ale předpokládejme, že byste uložili řádky do pole php pomocí řetězcové reprezentace id jako klíč a datum jako hodnotu, pak by tento kód měl stačit:

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

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




  1. Chyba při používání připravených příkazů PDO a LIMIT v dotazu

  2. jak zobrazit celý kód uložené procedury?

  3. DATENAME() Příklady v SQL Server

  4. SUM(poddotaz) v MYSQL