我似乎无法找到关于此的更多信息。
我有一个表来记录用户评论。我有另一个表来记录每个评论的其他用户的喜欢/不喜欢。 因此,当选择要在网页上显示的数据时,存在需要连接和子查询来计算所有喜欢/不喜欢的复杂查询。 我的例子是有人在这里帮助我实现所需结果的查询:
SELECT comments.comment_id, comments.descr, comments.created, usrs.usr_name,
(SELECT COUNT(*) FROM comment_likers WHERE comment_id=comments.comment_id AND liker=1)likes,
(SELECT COUNT(*) FROM comment_likers WHERE comment_id=comments.comment_id AND liker=0)dislikes,
comment_likers.liker
FROM comments
INNER JOIN usrs ON ( comments.usr_id = usrs.usr_id )
LEFT JOIN comment_likers ON ( comments.comment_id = comment_likers.comment_id
AND comment_likers.usr_id = $usrID )
WHERE comments.topic_id=$tpcID
ORDER BY comments.created DESC;
但是,如果我在COMMENTS表中添加了喜欢和不喜欢的列并创建了一个触发器来自动递增/递减这些列,因为喜欢插入/删除/更新到LIKER表,那么SELECT语句会更简单更多效率比现在高。我问,用COUNTS进行这个复杂的查询或者有额外的列和触发器是否更有效?
总而言之,COUNT更有效率,或者在定期查询时有额外的列计数?
答案 0 :(得分:0)
您的查询效率很低。您可以轻松地消除这些子查询,这将显着提高性能:
您的两个子查询可以简单地替换为:
sum(liker) likes,
sum(abs(liker - 1)) dislikes,
完成整个查询:
SELECT comments.comment_id, comments.descr, comments.created, usrs.usr_name,
sum(liker) likes,
sum(abs(liker - 1)) dislikes,
comment_likers.liker
FROM comments
INNER JOIN usrs ON comments.usr_id = usrs.usr_id
LEFT JOIN comment_likers ON comments.comment_id = comment_likers.comment_id
AND comment_likers.usr_id = $usrID
WHERE comments.topic_id=$tpcID
ORDER BY comments.created DESC;