показывает записи MySQL дважды из-за внутреннего соединения - PullRequest
0 голосов
/ 12 декабря 2018

В приведенном ниже запросе (Mentors) 13, что показывает мне 26, в то время как (SchoolSupervisor) 5, что показывает мне 10, что неправильно.это из-за доказательств, которые имеют 2 доказательства, из-за 2 доказательств значения Mentors & SchoolSupervisor показывают мне двойное значение.Пожалуйста, помогите мне.

Запрос:

select t.c_id,t.province,t.district,t.cohort,t.duration,t.venue,t.v_date,t.review_level, t.activity, 
        SUM(CASE WHEN pr.p_association = "Mentor" THEN 1 ELSE 0 END) as Mentor, 
        SUM(CASE WHEN pr.p_association = "School Supervisor" THEN 1 ELSE 0 END) as SchoolSupervisor,
        (CASE WHEN count(file_id) > 0 THEN "Yes" ELSE "No" END) as evidence
        FROM review_m t , review_attndnce ra 
        LEFT JOIN participant_registration AS pr ON pr.p_id = ra.p_id 
        LEFT JOIN review_files AS rf ON rf.training_id  = ra.c_id
        WHERE 1=1 AND t.c_id = ra.c_id
        group by t.c_id, ra.c_id order by t.c_id desc

введите описание изображения здесь

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

попробуйте добавить это в ГДЕ часть вашего запроса

AND pr.p_id IS NOT NULL AND rf.training_id IS NOT NULL
0 голосов
/ 12 декабря 2018

Вы можете добавить группу по pr.p_id, чтобы удалить дублирующиеся записи.Так как группа по pr на данный момент отсутствует, может быть несколько записей одного и того же p_id для одного ra

group by t.c_id, ra.c_id, pr.p_id order by t.c_id desc
0 голосов
/ 12 декабря 2018

Вы можете выполнить агрегирование в отдельном подзапросе, а затем присоединиться к нему:

SELECT
    t.c_id,
    t.province,
    t.district,
    t.cohort,
    t.duration,
    t.venue,
    t.v_date,
    t.review_level,
    t.activity,
    pr.Mentor,
    pr.SchoolSupervisor,
    rf.evidence
FROM review_m t
INNER JOIN review_attndnce ra
    ON t.c_id = ra.c_id
LEFT JOIN
(
    SELECT
        p_id,
        COUNT(CASE WHEN p_association = 'Mentor' THEN 1 END) AS Mentor,
        COUNT(CASE WHEN p_association = 'School Supervisor' THEN 1 END) AS SchoolSupervisor,
    FROM participant_registration
    GROUP BY p_id
) pr
    ON pr.p_id = ra.p_id
LEFT JOIN
(
    SELECT
        training_id,
        CASE WHEN COUNT(file_id) > 0 THEN 'Yes' ELSE 'No' END AS evidence
    FROM review_files
    GROUP BY training_id
) rf
    ON rf.training_id = ra.c_id
ORDER BY
    t.c_id DESC;

Обратите внимание, что это также устраняет другую проблему, которая возникла в вашем запросе, а именно то, что вы выбирали много столбцов, которые непоявляются в предложении GROUP BY.В этом рефакторе нет ничего плохого в вашем текущем выборе, поскольку агрегация происходит в отдельном подзапросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...