Несколько левых соединений - PullRequest
1 голос
/ 16 декабря 2011

Я пытаюсь создать один запрос, содержащий необязательные статистические значения из нескольких таблиц, но с некоторыми трудностями. Я постараюсь упростить мою проблему до как можно меньшего числа полей.

Таблица

приложения

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;

Задача

Я уверен, что это не самый эффективный способ сделать то, что я пытаюсь сделать, и независимо от того, что это не работает. Значения для регистраций / рефералов / билетов просто возвращают счет для каждой записи в каждой из таблиц. Присоединение победителя работает нормально, и если я ограничу его только регистрациями, это также работает. Таблица регистраций связана с таблицей конкурсов, а затем рефералы и заявки напрямую связаны с таблицей регистраций. Любая помощь по этому сложному запросу будет принята с благодарностью.

1 Ответ

1 голос
/ 16 декабря 2011

Простите, если я неправильно понимаю, а также за отсутствие знаний о различиях между MSSQL и mysql, но я бы попробовал что-то вроде этого:

SELECT 
    ( SELECT CONCAT(IFNULL(firstname,''), ' ' , IFNULL(lastname,'')) 
      FROM Signups 
      WHERE id = c.winnerid) as Winner,
    ( SELECT COUNT(*) 
      FROM Signups  
      WHERE contestid = c.id) as Signups,
    ( SELECT COUNT(*)
      FROM referrals r LEFT JOIN signups su ON r.signupid = su.id
      WHERE su.contestid = c.id) as Referrals, 
    ( SELECT COUNT(*)
      FROM tickets t LEFT JOIN signups su ON t.signupid = su.id
      WHERE su.contestid = c.id) as Tickets
FROM
    Contests c 
...