выполнить агрегирование встроенных представлений, при этом встроенное представление возвращает одну строку на user_id, чтобы избежать полукартового произведения (частичное перекрестное произведение)
Примерно так:
SELECT u.name
, IFNULL(t.tot_expenseamount,0) AS tot_expense_amount
, IFNULL(n.tot_noofmeal,0) AS tot_no_of_meal
FROM users u
LEFT
JOIN ( SELECT e.user_id
, SUM(e.expenseamount) AS tot_expenseamount
FROM expense e
WHERE e.expensedate >= '2019-04-01' + INTERVAL 0 MONTH
AND e.expensedate < '2019-04-01' + INTERVAL 1 MONTH
GROUP
BY e.user_id
) t
ON t.user_id = u.id
LEFT
JOIN ( SELECT m.user_id
, SUM(m.noofmeal) AS tot_noofmeal
FROM meal m
WHERE m.mealdate >= '2019-04-01' + INTERVAL 0 MONTH
AND m.mealdate < '2019-04-01' + INTERVAL 1 MONTH
GROUP
BY m.user_id
) n
ON n.user_id = u.id
ORDER
BY u.name
Обратите внимание, что запросы встроенного представления n
и t
возвращают одну строку на user_id с общей суммой расходов или общим количеством приемов пищи.Для проверки каждый запрос встроенного представления может быть выполнен отдельно для проверки результатов.