Мой мозг начинает болеть от этого запроса, и я был бы признателен за некоторые рекомендации. В результате этого запроса я пытаюсь получить три значения: посещаемостьScore , lootScore и totalScore (посещаемостьScore - lootScore).
Посещаемость отслеживается по трем таблицам: attendance
, attendancelog
и attendancevalues
.
attendance
записывает статус присутствия человека, прикрепленный к записи attendancelog
. Существуют типы посещаемости, такие как «посещено», «пропущено» и «вызвано».
attendancelog
- родительская запись, в которой записываются тип события, название и дата, а также кто регистрировал посещаемость и когда.
attendancevalues
- это таблица конфигурации, которая соответствует посещаемости type
с attendance
и событию type
с attendancelog
и возвращает настраиваемый value
FLOAT.
Добыча отслеживается по двум таблицам: loot
и loottypes
.
loot
регистрирует каждый отдельный предмет, кто его получил, когда и какой type
добычи было (первичное, вторичное, бесплатное для всех).
loottypes
- это таблица конфигурации, которая берет type
из loot
и возвращает настраиваемый cost
FLOAT.
После некоторой работы я пришел с рабочим запросом, чтобы получить attendanceScore
и lootScore
:
SELECT
(SELECT SUM(t3.`value`)
FROM `attendance` t1
INNER JOIN `attendancelog` t2
ON t2.`id` = t1.`attendancelog_id`
INNER JOIN `attendancevalues` t3
ON t3.`eventtype_id` = t2.`type` AND t3.`attendancetype_id` = t1.`type`
WHERE t1.`user_id` = 3) as attendanceScore,
(SELECT SUM(t2.`cost`)
FROM `loot` t1
INNER JOIN `loottypes` t2
ON t2.`id` = t1.`type`
WHERE t1.`user_id` = 3) as lootScore
Я знаю, что это не работает, но я попытался добавить (attendanceScore - lootScore)
к запросу, но он говорит, что эти поля недоступны. В конечном итоге это то, что мне нужно для завершения запроса.
Я могу получить желаемый результат, скопировав каждый из подзапросов прямо в (attendanceScore - lootScore)
, но это просто отвратительно и, я уверен, излишне:
SELECT
(SELECT SUM(t3.`value`)
FROM `attendance` t1
INNER JOIN `attendancelog` t2
ON t2.`id` = t1.`attendancelog_id`
INNER JOIN `attendancevalues` t3
ON t3.`eventtype_id` = t2.`type` AND t3.`attendancetype_id` = t1.`type`
WHERE t1.`user_id` = 3) as attendanceScore,
(SELECT SUM(t2.`cost`)
FROM `loot` t1
INNER JOIN `loottypes` t2
ON t2.`id` = t1.`type`
WHERE t1.`user_id` = 3) as lootScore,
(
(SELECT SUM(t3.`value`)
FROM `attendance` t1
INNER JOIN `attendancelog` t2
ON t2.`id` = t1.`attendancelog_id`
INNER JOIN `attendancevalues` t3
ON t3.`eventtype_id` = t2.`type` AND t3.`attendancetype_id` = t1.`type`
WHERE t1.`user_id` = 3) - (SELECT SUM(t2.`cost`)
FROM `loot` t1
INNER JOIN `loottypes` t2
ON t2.`id` = t1.`type`
WHERE t1.`user_id` = 3)
) as totalScore
Может ли кто-нибудь помочь мне понять, какие методы использовать для превращения этого в нечто более упорядоченное и эффективное?