Это было бы по крайней мере на правильном пути ...
Если вы хотите НЕ показывать какие-либо детали с недопустимым идентификатором, просто измените ЛЕВЫЕ СОЕДИНЕНИЯ на ВНУТРЕННИЕ СОЕДИНЕНИЯ (они ограничат значения NULL)
SELECT `history`.`id`
, `parts`.`type_id`
, `part_list`.`name`
, `serialized_parts`.`serial`
, `history_actions`.`action`
, `history`.`date_added`
FROM `history_actions`
INNER JOIN `history` ON `history`.`action_id` = `history_actions`.`id`
LEFT JOIN `parts` ON `parts`.`id` = `history`.`part_id`
LEFT JOIN `serialized_parts` ON `serialized_parts`.`parts_id` = `history`.`part_id`
LEFT JOIN `part_list` ON `part_list`.`id` = `parts`.`type_id`
WHERE `history`.`unit_id` = '1'
ORDER BY `history`.`id` DESC