0

我有一个包含两个表的数据库:

形容词 - ID 主键;名称 varchar; adjectives_reviews - ID 主键;ADJECTIVE_ID 外键;REVIEW_ID 外键;计数整数

我想从 adjectives_reviews 中获取不同 ADJECTIVE_ID 的列表,其中包含具有相同 ADJECTIVE_ID 的所有行的“COUNT”列中的值的总和。

adjectives 表有 46,000 行,而 adjectives_reviews 有 ~2,849,708 行。

我正在使用以下 HTSQL 查询:

/adjectives{name,sum(adjectives_reviews.count)}

它被翻译成SQL:

SELECT `adjectives`.`name`,
       COALESCE(`adjectives_reviews`.`sum`, 0)
FROM `adjectives`
     LEFT OUTER JOIN (SELECT CAST(SUM(`adjectives_reviews`.`count`) AS SIGNED INTEGER) AS `sum`,
                             `adjectives_reviews`.`adjective_id`
                      FROM `adjectives_reviews`
                      GROUP BY 2) AS `adjectives_reviews`
                     ON (`adjectives`.`id` = `adjectives_reviews`.`adjective_id`)
ORDER BY `adjectives`.`id` ASC

这个查询产生了我想要的结果,但它太慢了。事实上,它太慢了,以至于 HTTP 服务器超时,我无法获得我需要的输出 CSV 文件。我正在寻找一种优化此查询的方法,或者一种在不使用 HTSQL 的 HTTP 接口的情况下将输出作为 CSV 的方法。

4

1 回答 1

0

通过使用本机 mysql 客户端并向查询中添加 3 行,我能够将结果作为 CSV 输出:

SELECT `adjectives`.`name`,
       COALESCE(`adjectives_reviews`.`sum`, 0)
FROM `adjectives`
     LEFT OUTER JOIN (SELECT CAST(SUM(`adjectives_reviews`.`count`) AS SIGNED INTEGER) AS `sum`,
                             `adjectives_reviews`.`adjective_id`
                      FROM `adjectives_reviews`
                      GROUP BY 2) AS `adjectives_reviews`
                     ON (`adjectives`.`id` = `adjectives_reviews`.`adjective_id`)
ORDER BY `adjectives`.`id` ASC
INTO OUTFILE '/tmp/adjectives.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

它跑得相当快。

于 2014-10-15T21:33:58.220 回答