2015-01-05 49 views
0

我有这个查询,我用它来从多个表中使用JOIN获取记录。使用JOIN获取大量记录

SELECT c.id   AS contestant_id, 
     c.created_date, 
     c.name   AS contestant_name, 
     counter.total AS score, 
     c.email 
    FROM submission AS s, 

     (SELECT ans.id AS ans_id, sub.contestant_id, count(sub.id) AS total 
      FROM submission AS sub 
      JOIN (SELECT id, is_true FROM answer) AS ans 
     WHERE sub.answer_id = ans.id 
      AND ans.is_true = 1 
     GROUP BY sub.contestant_id) AS counter 

    JOIN (SELECT id, name, email, type, created_date 
      FROM contestant 
     WHERE contest_type = 1 
      AND submission_status = 1) AS c 

WHERE counter.contestant_id = c.id 
GROUP BY c.id 
ORDER BY c.created_date DESC 

的问题是,在表选手每条记录​​将在提交表30的记录。所以,当我检索1000名参赛者或更多时,服务器挂起。

+0

你做完你的索引列 – Afsar

+0

什么你需要'提交AS s'呢? –

+0

你不能让你的GROUP BY与聚合函数一起吗?!?这很混乱。 – jarlh

回答

1

请尝试以下重组查询:

SELECT 
    c.id AS contestant_id, 
    c.created_date, 
    c.name AS contestant_name, 
    counter.total AS score, 
    c.email 
FROM 
    (
     SELECT 
     sub.contestant_id, count(sub.id) AS total 
     FROM 
     submission AS sub 
     JOIN answer AS ans 
      ON sub.answer_id = ans.id AND ans.is_true = 1 
     GROUP BY 
     sub.contestant_id 
    ) 
    AS counter 
    JOIN contestant c 
     ON c.contest_type = 1 AND c.submission_status = 1 AND c.id = counter.contestant_id 
WHERE 
    counter.contestant_id = c.id 
GROUP BY 
    c.id 
ORDER BY 
    c.created_date DESC