Вычисление SUM () из подзапросов итогов - PullRequest
0 голосов
/ 07 января 2019

Мой мозг начинает болеть от этого запроса, и я был бы признателен за некоторые рекомендации. В результате этого запроса я пытаюсь получить три значения: посещаемость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

Может ли кто-нибудь помочь мне понять, какие методы использовать для превращения этого в нечто более упорядоченное и эффективное?

1 Ответ

0 голосов
/ 07 января 2019

Вы можете использовать встроенный просмотр

SELECT attendanceScore,
        lootScore,
        attendanceScore - lootScore as totalScore
FROM
(
    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
) t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...