Vamos a probar lo siguente, convirtiendo el time y el date en sus formatos:
SELECT
h.fecha,
h.usuario,
min(hem.hora) AS 'entrada mañana',
max(hsm.hora) AS 'salida mañana',
min(het.hora) AS 'entrada tarde',
max(hst.hora) AS 'salida tarde'
FROM horario h
LEFT JOIN horario hem ON h.usuario = hem.usuario AND hem.hora < time('09:00:00')
LEFT JOIN horario hsm ON h.usuario = hsm.usuario AND hsm.hora BETWEEN time('09:00:01') AND time('15:00:00')
LEFT JOIN horario het ON h.usuario = het.usuario AND het.hora BETWEEN time('15:00:01') AND time('16:00:00')
LEFT JOIN horario hst ON h.usuario = hst.usuario AND hst.hora > time('16:00:01')
WHERE h.fecha = date('2011-01-01')
GROUP BY h.usuario, h.fecha;
Un saludo.
SELECT
h.fecha,
h.usuario,
min(hem.hora) AS 'entrada mañana',
max(hsm.hora) AS 'salida mañana',
min(het.hora) AS 'entrada tarde',
max(hst.hora) AS 'salida tarde'
FROM horario h
LEFT JOIN horario hem ON h.usuario = hem.usuario AND hem.hora < time('09:00:00')
LEFT JOIN horario hsm ON h.usuario = hsm.usuario AND hsm.hora BETWEEN time('09:00:01') AND time('15:00:00')
LEFT JOIN horario het ON h.usuario = het.usuario AND het.hora BETWEEN time('15:00:01') AND time('16:00:00')
LEFT JOIN horario hst ON h.usuario = hst.usuario AND hst.hora > time('16:00:01')
WHERE h.fecha = date('2011-01-01')
GROUP BY h.usuario, h.fecha;
Un saludo.