【发布时间】:2026-02-23 09:20:04
【问题描述】:
我有一个这样的 SQL 查询,我需要重新定义它,或者我相信使用索引会有所帮助,但我不知道哪些列包含在索引中。
-
b_answers大约有。数万行 -
b_projects大约有。数千行 -
b_users有几十行
这些AS count_* 列是排序所必需的。
SELECT
p.id,
p.datetime,
u.name AS u_name,
p.name,
p.note,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND changed != '0000-00-00 00:00:00') AS count_filled,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND started = '1') AS count_started,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id) AS count_sent,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '1' AND changed != '0000-00-00 00:00:00') AS count_filled_quiz1_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '2' AND changed != '0000-00-00 00:00:00') AS count_filled_quiz1_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '1' AND started = '1') AS count_started_quiz1_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '2' AND started = '1') AS count_started_quiz1_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '1') AS count_sent_quiz1_a
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '2') AS count_sent_quiz1_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '3' AND changed != '0000-00-00 00:00:00') AS count_filled_quiz3_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '4' AND changed != '0000-00-00 00:00:00') AS count_filled_quiz3_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '3' AND started = '1') AS count_started_quiz3_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '4' AND started = '1') AS count_started_quiz3_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '3') AS count_sent_quiz3_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '4') AS count_sent_quiz3_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '5' AND changed != '0000-00-00 00:00:00') AS count_filled_quiz5_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '6' AND changed != '0000-00-00 00:00:00') AS count_filled_quiz5_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '5' AND started = '1') AS count_started_quiz5_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '6' AND started = '1') AS count_started_quiz5_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '5') AS count_sent_quiz5_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '6') AS count_sent_quiz5_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '7' AND changed != '0000-00-00 00:00:00') AS count_filled_quiz7_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '8' AND changed != '0000-00-00 00:00:00') AS count_filled_quiz7_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '7' AND started = '1') AS count_started_quiz7_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '8' AND started = '1') AS count_started_quiz7_b,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '7') AS count_sent_quiz7_a,
(SELECT COUNT(id) FROM b_answers WHERE project = t.id AND quiz = '8') AS count_sent_quiz7_b
FROM
b_projects p
LEFT JOIN
b_answers a ON a.project = p.id
LEFT JOIN
b_users u ON u.id = p.admin
GROUP BY
p.nazev
【问题讨论】:
-
这适用于哪个 RDBMS?请添加一个标签以指定您使用的是
mysql、postgresql、sql-server、oracle还是db2- 或者完全是其他东西。 -
MySQL,很抱歉漏掉了,我已经填好了。
标签: mysql sql performance indexing count