Mysql 使用GROUPBY和Count避免嵌套SQL

Mysql 使用GROUPBY和Count避免嵌套SQL,mysql,codeigniter,join,nested,aggregate,Mysql,Codeigniter,Join,Nested,Aggregate,我正在尝试创建一个SQL语句,它需要对两个表进行计数,从第三个表中提取用户详细信息,并在结果中显示所有信息 当前SQL语句的处理时间超过9秒,我曾尝试使用联接或创建视图e.t.c.重新实现该语句,但所有语句都失败或耗时超过9秒。我在这里搜索并找到了一些有趣的帖子,但没有一篇能够再次解决我的问题 SQL语句是 SELECT COUNT(t_a.created_by) AS creator, (SELECT COUNT(t_b.user_id) FROM t_b WHERE t_b.user_id=

我正在尝试创建一个SQL语句,它需要对两个表进行计数,从第三个表中提取用户详细信息,并在结果中显示所有信息

当前SQL语句的处理时间超过9秒,我曾尝试使用联接或创建视图e.t.c.重新实现该语句,但所有语句都失败或耗时超过9秒。我在这里搜索并找到了一些有趣的帖子,但没有一篇能够再次解决我的问题

SQL语句是

SELECT COUNT(t_a.created_by) AS creator,
(SELECT COUNT(t_b.user_id) FROM t_b WHERE t_b.user_id=t_a.created_by AND (t_a.status=1 OR t_a.status=3 OR t_a.status=4)) AS answer, 
t_user.*
FROM t_a
INNER JOIN t_user ON t_user.userID=t_a.created_by
WHERE (t_a.status=1 OR t_a.status=3) AND (t_user.user_role=1 OR t_user.user_role=2)
GROUP BY t_a.created_by
ORDER BY creator DESC, ans DESC, t_user.registered_on DESC
LIMIT 10
需要明确的是,所有这些字段都是参考匹配键:t_a.created_by,t_b.user_id,t_user.userID。这3个都是用户ID。t_a是一个由t_a创建的问题组成的表,t_b是一个由t_b.user_id回答其他用户的不同问题组成的表。我需要计算每个用户创建的问题数量和每个用户回答的答案数量,并从高到低排列顺序。 我尝试创建两个视图,然后从中提取信息。当我在phpmyadmin中测试它时,它就像一个符咒。但当我实现它时,它并没有像预期的那样运行

以下是两个视图:

create or replace view v_creator as 
select created_by,count(t_a.created_by) as creator
from t_a
where (t_a.status=1 OR t_a.status=3)
GROUP BY t_a.created_BY
ORDER BY creator DESC;

create or replace view v_answer as 
select user_id,count(t_b.user_id) as answer
from t_b
inner join t_a on t_a.pollID=t_b.poll_id
where (t_a.status=1 OR t_a.status=3 OR t_a.status=4)
GROUP BY t_b.user_id
ORDER BY answer DESC;
SQL从这些视图中提取数据并将其与第三个表连接:

select creator,answer,t_user.* from v_creator
inner join v_answer on v_answer.user_id=v_creator.created_by
inner join t_user on t_user.userID=v_creator.created_by
where (t_user.user_role=1 OR t_user.user_role=2)
order by creator desc, answer desc, t_user.registered_on desc
limit 10
在我的模型中(使用codeigniter),我有以下代码:

$this->db->query('create or replace view v_creator as select created_by,count(t_a.created_by) as creator from t_a where (t_a.status=1 OR t_a.status=3) GROUP BY t_a.created_BY ORDER BY creator DESC;');
    $query->result();
    $this->db->query('create or replace view v_answer as select user_id,count(t_b.user_id) as answer from t_b inner join t_a on t_a.pollID=t_b.poll_id where (t_a.status=1 OR t_a.status=3 OR t_a.status=4) GROUP BY t_b.user_id ORDER BY answer DESC;');   
    $query->result();
第一个视图(v_creator)已创建,但第二个视图(v_answer)未创建。即使我交换顺序,即先创建v_答案,然后尝试v_creator,v_creator也会失败。因此,SQL绝对是正确的。没有错误消息,页面(视图)呈现为空白

基本上要解决这个问题,我要么需要设法使这些db视图正常工作,要么必须以不同的方式编写SQL。不幸的是,我不是SQL方面的专家,因此如果我错过了一个显而易见的答案,请原谅我

这是我从laggy SQL语句中得到的正确输出,请注意,我已经去掉了不重要的用户信息,如电子邮件/姓名/IPs e.t.c,我只显示了前5名,尽管我确实获得了前10名:

creator answer  userID  
1021    2820    720
933     3336    278
100     709     354
100     532     901

我建议使用
count()
s连接所有三个表,在where和on子句中使用的列对它们进行索引,所有这些都会很好。对所需的结果集进行更精确的说明将非常有用。摆弄视图不会有帮助,但在表上创建适当的索引可能会有所帮助。