我有这些sql查询(我使用codeigniter db class):
$query = $this->db->select("a.title AS articles_title,
a.content AS articles_content,
a.excerpt AS articles_excerpt,
a.slug AS articles_slug,
a.views AS articles_views,
a.views AS articles_views,
CONCAT(up.first_name, ' ', up.last_name) AS articles_author,
DATE_FORMAT(a.created, '%T %d.%m.%Y') AS articles_created,
(SELECT IF(ROUND(AVG(av.vote),1), ROUND(AVG(av.vote),1), 0) FROM articles_votes av WHERE a.id = av.article_id) AS articles_votes,
(SELECT COUNT(ac.id) FROM articles_comments ac WHERE a.id = ac.article_id) AS articles_totalcomments", FALSE)
->from('articles a')
->join('user_profiles up', 'a.author_id = up.user_id')
->where('page_id', $page_id)
->order_by("a.$ordering")
->get();
对服务器资源和速度有好处吗?或者我应该创建另一个计算投票和评论的功能,这将计算所有评论和平均投票,然后将其添加到文章数组中?
谢谢
答案 0 :(得分:0)
使用的资源和查询计划的效率取决于底层数据库,当然还有生成的实际SQL。使用SQL分析工具总是很好,以确保您了解查询的实际结果。
那就是说。你有时会得到更好的表现,如下所示:
SELECT
a.student_id,
a.name,
(select sum(s.score) from scores s where s.student_id = a.student_id) as total_score
FROM students a
对于这样的事情:
SELECT
a.student_id,
a.name,
tot.score
FROM students a
JOIN (
SELECT student_id,
sum(score)
FROM scores
GROUP BY student_id
) as tot ON tot.student_id = a.student_id
如果列表达式涉及对未编制索引的列的查询,则每次运行时都可能需要进行全表扫描。在我的示例中,我在连接结果中包含一个键,因此查询完成一次,然后您可以在外部选择中获取它。
希望有所帮助。