mysql - 使用 JOIN 获取大量记录

标签 mysql sql

我有一个查询,用于使用 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

问题是contestant表中的每条记录在submission表中将有30条记录。因此,当我检索到 1000 名或更多参赛者时,服务器就会挂起。

最佳答案

请尝试以下重组查询:

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

关于mysql - 使用 JOIN 获取大量记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27775753/

相关文章:

用于 clojure korma 的 MySQL DB 驱动程序

python - 为什么我的函数 "hangs"

sql - 如何从 T-SQL 中的表中选择前 N 行?

mysql - Spring 应用程序启动验证具有错误数据库表的实体

mysql - Sequelize - 检查与您的 MySQL 服务器版本相对应的手册以了解要使用的正确语法

mysql - CentOS上无法远程访问MySQL服务器

mysql - 在 mysql 中查询股票/价格趋势

sql - 如何在 SQL 中每列值只选择一行?

mysql - 在 MySQL 中以 root 身份登录不需要密码

java - 如何将 @ManyToOne 关联映射到 SQL 查询的结果