我正在尝试创建一个SQL语句,该语句需要对2个表进行计数并从第三个表中提取用户详细信息并在结果中显示所有内容。
当前的SQL语句需要9秒多的时间来处理,我尝试使用JOIN或创建VIEWs 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.created_by创建的问题组成的表,t_b是由t_b.user_id回答其他用户的不同问题的答案的表。我需要计算每个用户创建的问题数量和每个用户回答的答案数量以及从最高到最低的顺序。 我尝试创建2个视图,然后从那里提取信息。当我在phpmyadmin中测试它时,它就像一个魅力。但是当我实现它时,它无法按预期运行。
这是2个观点:
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;
用于从这些视图中提取数据并将其与第3个表连接的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_answer然后尝试v_creator,v_creator也会失败。所以,SQL肯定是正确的。没有错误消息,页面(视图)呈现为空白。
基本上要解决这个问题,我要么以某种方式管理这些数据库视图,要么以不同的方式编写SQL代码。不幸的是,我不是SQL方面的专家,因此如果我错过了一个明显的答案,请原谅我。
这是我从滞后的SQL语句中得到的正确输出,请注意我已经删除了不重要的用户信息,如电子邮件/名称/ IP等,我只显示前5名,尽管我获得前10名:
creator answer userID
1021 2820 720
933 3336 278
100 709 354
100 532 901