I don't believe there is a way to combine all three statements. The closest thing to that doesn't really help you, and that is a SET SELECT. Your best bet is a trigger. Below is a sample of a trigger that I often use to maintain just such an audit trail (constructed with PHP):
$trigger = "-- audit trigger --\nDELIMITER $ \n".
"DROP TRIGGER IF EXISTS `{$prefix}_Audit_Trigger`$\n".
"CREATE TRIGGER `{$prefix}_Audit_Trigger` AFTER UPDATE ON `$this->_table_name` FOR EACH ROW BEGIN\n";
foreach ($field_defs as $field_name => $field) {
if ($field_name != $id_name) {
$trigger .= "IF (NOT OLD.$field_name <=> NEW.$field_name) THEN \n".'INSERT INTO AUDIT_LOG ('.
'Table_Name, Row_ID, Field_Name, Old_Value, New_Value, modified_by, DB_User) VALUES'.
"\n ('$this->_table_name',OLD.$this->_id_name,'$field_name',OLD.$field_name,NEW.$field_name,".
"NEW.modified_by, USER()); END IF;\n";
}
}
$trigger .= 'END$'."\n".'DELIMITER ;';