Dette er ikke det komplette svar, men det er tæt på. Uanset hvordan jeg arbejder med dataene, kan jeg dog ikke finde ud af, hvordan du finder på cash_has
. Jeg beholder det også rå SQL, fordi jeg føler, at det ville være mere nyttigt og ikke burde være svært at konvertere tilbage til forespørgselsbyggeren. Jeg kender heller ikke de nøjagtige kolonnenavne, så du skal muligvis rette nogle af dem.
SELECT
COALESCE(outlets_admin.name, outlets.name) AS outlet,
COALESCE(boys_admin.name, boys.name) AS delivery_boy,
SUM(IF(cm.source_type = 'admin', amount, 0)) AS cash_taken,
SUM(IF(cm.source_type = 'deliveryBoy', amount, 0)) AS cash_returned,
SUM(IF(cm.source_type = 'admin', amount, 0)) - SUM(IF(cm.source_type = 'deliveryBoy', amount, 0)) AS cash_has
FROM delivery_cash_manages cm
LEFT JOIN outlets ON outlets.id = cm.destination_id AND cm.source_type = 'deliveryBoy'
LEFT JOIN delivery_boys boys ON boys.id = cm.source_id AND cm.source_type = 'deliveryBoy'
LEFT JOIN outlets outlets_admin ON outlets_admin.id = cm.source_id AND cm.source_type = 'admin'
LEFT JOIN delivery_boys boys_admin ON boys_admin.id = cm.destination_id AND cm.source_type = 'admin'
WHERE COALESCE(outlets.id, outlets_admin.id) = '2' # This is where you plug in your $outlet_id
GROUP BY outlet, delivery_boy
Grunden til, at du får en fejl med din forespørgsel, er, at hvis du grupperer efter noget, skal du gruppere efter alt, hvad du vælger, som ikke er aggregerede kolonner (funktioner som sum, max, avg).