gere uma instrução de junção externa para que você obtenha:
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
onde ids é uma subconsulta enumerando todos os valores, algo assim:
$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"
certifique-se de selecionar
ids.id
, não table_live.id
. Dessa forma, os ids sempre aparecerão, e o moderation_date somente se a linha correspondente existir em table_live. Outra abordagem seria manter a consulta como você fez, armazenar o resultado em uma matriz e, em seguida, mesclar as matrizes em php para que você retenha todas as chaves e preencha os valores apenas onde a chave corresponder em ambas as matrizes.
Não tenho certeza de que tipo de biblioteca db você está usando, então não sei como obter uma matriz do conjunto de resultados, mas suponha que você tenha armazenado as linhas em uma matriz php, usando uma representação de string do id como key e a data como valor, esse código deve fazer o truque:
$items = array(
'1' => NULL
, '2' => NULL
, ...
);
//note: use string keys in order to merge!!
$result = array_merge($items, $resultset);
veja:http://php.net/manual/en/function.array -merge.php