man, i don't know how you guys can hope to maintain queries when they're written as a solid block of code like that
helpful formatting, let me show u it
Code:
SELECT t2.FirstName
, t2.LastName
, SEC_TO_TIME( SUM( TIME_TO_SEC( t1.TimeWorked ) ) ) AS WrenchTime
, q1.ClockTime
, q2.BillTime
, q2.BillAmt
, ROUND( SUM( TIME_TO_SEC( t1.TimeWorked ) / 3600 )
* t4.LaborRate, 2 ) AS ExpBill
FROM invLabor AS t1 USE INDEX ( iinvLabor_performedby )
LEFT OUTER
JOIN conAdditionalContacts AS t2
USE INDEX FOR JOIN ( iconAdditionalContacts_UserID )
ON t1.WorkPerformedBy = t2.UserID
LEFT OUTER
JOIN ( SELECT UserID
, SEC_TO_TIME( SUM( TIME_TO_SEC( TimeLogged ) ) ) AS ClockTime
FROM prlTimeClock
WHERE TimeIn >= '2010-03-23'
AND TimeIn < '2010-03-25'
AND TimeTypeID = 3
GROUP BY UserID ) AS q1
ON t1.WorkPerformedBy = q1.UserID
LEFT OUTER
JOIN ( SELECT WorkPerformedBy
, SUM( LaborHours ) AS BillTime
, SUM( JobLaborTotal ) AS BillAmt
FROM invJobs AS st1
INNER
JOIN ( SELECT distinct WorkPerformedBy
, JobID
FROM invLabor
WHERE DateCreated >= '2010-03-23'
AND DateCreated < '2010-03-25' ) AS sq1
ON sq1.JobID = st1.JobID
WHERE LaborRateID > 0
GROUP BY WorkPerformedBy ) AS q2
ON t1.WorkPerformedBy = q2.WorkPerformedBy
LEFT OUTER
JOIN invJobs AS t3
ON t1.JobID = t3.JobID
LEFT OUTER
JOIN optLaborRates AS t4
ON t3.LaborRateID = t4.LaborRateID
WHERE t1.DateCreated >= '2010-03-23'
AND t1.DateCreated < '2010-03-25'
GROUP
BY t2.FirstName
, t2.LastName
and don't forget my suggestion that in any query which has more than one table, ~every~ column should be qualified by its table name
can you explain why you felt it necesssary to outthink the optimizer by overriding its freedom to choose the appropriate indexes?