我正在运行MySQL查询,根据他们贡献的书评和食谱评论的数量对我的网站用户进行排名.在使用多个JOIN查询的初始问题之后,我已切换到一系列子查询,这要快得多.但是,虽然我可以从每个成员中提取评论数量,但我无法弄清楚如何将它们添加到一起,因此我可以按总数进行排序.
这是当前的查询:
SELECT users.*,
(SELECT count(*) FROM bookshelf WHERE bookshelf.user_id = users.ID) as titles,
(SELECT count(*) FROM book_reviews WHERE book_reviews.user_id = users.ID) as bookreviews,
(SELECT count(*) FROM recipe_reviews WHERE recipe_reviews.user_id = users.ID) as recipereviews
FROM users
Run Code Online (Sandbox Code Playgroud)
我需要将bookreviews和recipereviews加在一起以获得'reviewtotals'.MySQL不会允许你使用简单的语法来对别名进行计算,但我认为还有另一种方法可以做到这一点?
我还在学习MySQL.我可能会犯一个非常基本的错误,我准备在这里受到惩罚......
此查询尝试做的是根据他们所做的书籍和食谱评论的数量从我们的网站中选择最高成员.
我正在计算SQL查询本身的总数.考虑到目前为止我们只有400名成员和几千条评论并且它的增长速度非常快,因此查询速度很慢(9秒)并且肯定无法扩展.
我认为它在这里进行全表扫描,并且计算速度正在减慢,但我不知道另一种方法可以做到这一点,并且会喜欢一些智慧.
这是SQL语句:
SELECT users.*, COUNT( DISTINCT bookshelf.ID ) AS titles, COUNT( DISTINCT book_reviews.ID ) as bookreviews, COUNT( DISTINCT recipe_reviews.ID ) AS numreviews, COUNT( DISTINCT book_reviews.ID ) + COUNT( DISTINCT recipe_reviews.ID ) as reviewtotal
FROM users
LEFT OUTER JOIN recipe_reviews ON recipe_reviews.user_id = users.ID
LEFT OUTER JOIN book_reviews ON book_reviews.user_id = users.ID
LEFT OUTER JOIN bookshelf ON users.ID = bookshelf.user_id
GROUP BY users.ID
ORDER BY reviewtotal DESC
LIMIT 8
Run Code Online (Sandbox Code Playgroud)
这是解释:
+----+-------------+----------------+-------+-------------------+-------------------+---------+---------------------+------+---------------------------------+
| id | select_type | table | …Run Code Online (Sandbox Code Playgroud)