Q:

Obtener Diferentes registros de una sola tabla en una consulta Multiple

Buen día a todos.
Acudo a ustedes solicitando su consejo acerca de como puedo realizar una sentencia (de ser posible solo una).
La situación es la siguiente, en mi base de datos tengo 4 tablas de las que requiero sacar información para un reporte que tiene estos campos: 
| Campaña | No. Empleado | Nombres | Apellidos | Horario | Hora de llegada | Hora de Salida | Horas trabajadas |
La estructura de las tablas seria algo así:
users
| Employee - INT 
| FName - VarChar 
| LName - Varchar 
| Campaign_ID - INT 
| Active - BOOLEAN 

schedule
| Employee - INT 
| Year - INT 
| Week - INT 
| Mon - VarChar 
| Tue - VarChar 
| Wed - VarChar (etc etc)

logs
| UserName - INT 
| Time - VarChar 
| Date - Varchar 
| Status - Varchar

campaigns
| Campaign_ID - INT 
| Name - VarChar 

Consulta
SET @Fecha = '4/23/2018' ;

SELECT c.`Name`,u.`Employee`,u.`FName`,u.`LName`,s.`Tue` ,l1.`Time` as 'Check In',l2.`Time` as 'Check Out',TIMEDIFF(l1.`Time`,l2.`Time`) as 'Worked Hours' FROM
`users` u, `campaigns` c, `schedule` s, `logs` l1, `logs` l2 
WHERE 
u.`Active` = 1 
AND c.`Campaign_ID` = u.`Campaign_ID`
AND l1.`UserName` = u.`Employee`
AND l2.`UserName` = u.`Employee`
AND l1.`Date` = @Fecha
AND l2.`Date` = @Fecha
AND l1.`Status` = 'Clocked In'
AND l2.`Status` = 'Clocked Out'
AND l2.`Time` = MAX(l2.`Time`)
AND l1.`Time` = MIN(l1.`time`)
AND s.`Employee` = u.`Employee`
AND s.`Year` = Year(@Fecha)
AND s.`Week` = Week(@Fecha,6)

Este es la consulta que trato de utilizar, pero obviamente no funciona. Quiero evitar estar haciendo consultas a la tabla de logs para cada uno de los 400 empleados 
Anteriormente tenia una aplicación que cargaba en un Data Set la información de todos los 400 usuarios, en otro Data Set cargaba todos los horarios, así mediante un For Loop generaba dos consultas por cada usuario en el Data Set para ver la hora de llegada y la hora de salida.
Después, la aplicación calculaba la diferencia de horas y las acomodaba dentro de el reporte, esto tardaba hasta 10 minutos, lo cual considero es demasiado tiempo para algo relativamente tan sencillo. Ademas las computadoras que tenemos disponibles no son las mas potentes que digamos, sin embargo estamos rentando un servidor que tiene muy buenas especificaciones, así que pienso que es mas conveniente darle mas carga al servidor. 
P.D. Estoy consiente del pecado que cometimos al poner el tiempo y la fecha como VarChar, pero las aplicaciones que se usan para tomar asistencia así lo especificaban, estamos en el proceso de cambiar esa cuestión y manejar esos dos campos mediante un TimeStamp, mientras tanto aun tenemos poco mas de un millón de registros en logs con los que aun tenemos que lidiar.
De antemanos gracias.

A:

Prueba la consulta de esta manera:
SELECT 
    c.`Name`,
    u.`Employee`,
    u.`FName`,
    u.`LName`,
    s.`Tue` ,
    l1.`Time` Check_In,
    l2.`Time` Check_Out,
    TIMEDIFF(l1.`Time`,l2.`Time`) 'Worked_Hours' 

FROM `logs` l1
    INNER JOIN `users`     u   ON   l1.`UserName`   =   u.`Employee`
    INNER JOIN `campaigns` c   ON   c.`Campaign_ID` =   u.`Campaign_ID`
    INNER JOIN `schedule`  s   ON   s.`Employee`    =   u.`Employee`
    INNER JOIN `logs`      l2  ON   l2.`UserName`   =   u.`Employee`

WHERE 
        u.`Active` = 1 
    AND l.`Date` = @Fecha
    AND l1.`Status` = 'Clocked In'
    AND l2.`Status` = 'Clocked Out'
    AND l2.`Time` = MAX(l2.`Time`)
    AND l1.`Time` = MIN(l1.`time`)
    AND s.`Year` = Year(@Fecha)
    AND s.`Week` = Week(@Fecha,6)
;   

De todos modos, si los índices de las tablas no están bien establecidos, es probable que las consultas se ralenticen, y mientras la BD crece será peor. Conviene que diseñes una estrategia segura para normalizar los datos. 
No sé si también el uso de TIMEDIFF dentro de la consulta sea conveniente, o si no sería mejor hacer ese cálculo por programación. Es cuestión de ir haciendo pruebas, para optar por lo que sea más conveniente.

