Я пытаюсь создать один запрос, содержащий необязательные статистические значения из нескольких таблиц, но с некоторыми трудностями. Я постараюсь упростить мою проблему до как можно меньшего числа полей.
Таблица
приложения
appid | pageid
конкурсы
id | appid | winnerid
регистрации
id | contestid | firstname | lastname
рефералов
id | signupid
билеты
id | signupid
Цель запроса
Я пытаюсь объединить таблицы заявок и конкурсов на основе параметра pageid , присоединиться к таблице регистраций, чтобы получить победителя, когда он будет доступен, а затем подсчитать все регистрации, рефералов и заявок или просто нулевое значение, когда ни один не доступен.
Что у меня так далеко
SELECT t1.*, `Winner`.Name AS Winner, IFNULL(`srt`.Signups,0) AS Signups,
IFNULL(`srt`.Referrals,0) AS Referrals,
IFNULL(`srt`.Tickets,0) AS Tickets
FROM applications a, (contests c LEFT JOIN
/* Join signups table to retrieve winner's first/last name */
(SELECT id, contestid, CONCAT(firstname, ' ' , lastname) AS Name
FROM signups) `Winner`
ON c.winnerid = `Winner`.id
AND c.contestid = `Winner`.contestid) LEFT JOIN
/* Join signups, referrals, and tickets to retrieve counts */
(SELECT s.signupid, COUNT(*) AS Signups, Referrals, Tickets
FROM (signups s LEFT JOIN
(SELECT r.signupid, COUNT(r.id) AS Referrals
FROM signups s, referrals r
WHERE s.signupid = r.signupid) `Referrals`
ON s.signupid = `Referrals`.signupid) LEFT JOIN
(SELECT t.signupid, COUNT(t.id) AS Tickets
FROM signups s, tickets t
WHERE s.signupid = t.signupid) `Tickets`
ON s.signupid = `Tickets`.signupid) `srt`
ON signupid = `srt`.signupid
WHERE a.id = c.applicationid
AND a.pageid = @pageid
ORDER BY c.id IN (SELECT id FROM contests WHERE active = 1) desc, c.addeddate desc;
Задача
Я уверен, что это не самый эффективный способ сделать то, что я пытаюсь сделать, и независимо от того, что это не работает. Значения для регистраций / рефералов / билетов просто возвращают счет для каждой записи в каждой из таблиц. Присоединение победителя работает нормально, и если я ограничу его только регистрациями, это также работает. Таблица регистраций связана с таблицей конкурсов, а затем рефералы и заявки напрямую связаны с таблицей регистраций. Любая помощь по этому сложному запросу будет принята с благодарностью.