选择包含更多项目的用户

时间:2009-07-26 15:08:53

标签: sql

每个用户都有很多照片和很多评论。我想通过

SUM(number_of_photos, number_of_comments)

订购用户

你能建议我使用SQL查询吗?

5 个答案:

答案 0 :(得分:5)

GROUP BY with JOIN比依赖子查询更有效(在我所知的所有关系数据库中):

Select * From Users
Left Join Photos On (Photos.user_id = Users.id)
Left Join Comments On (Comments.user_id = Users.id)
Group By UserId
Order By (Count(Photos.id) + Count(Comments.id))

对表格做了一些假设(例如每个表中都有id个主键)。

答案 1 :(得分:1)

Select * From Users U
Order By (Select Count(*) From Photos
          Where userId = U.UserId) +
          (Select Count(*) From Comments
          Where userId = U.UserId)

编辑:虽然每个使用子查询的查询也可以使用连接来完成,这会更快,

  1. 不是一个简单的问题,
  2. 除非系统是,否则无关紧要     遇到性能问题。
  3. 1)两个结构必须由查询优化器转换为查询计划,其中包括某种类型的相关联接,无论是嵌套循环连接,散列连接,合并连接等等。并且完全有可能(甚至可能)它们都会产生相同的查询计划。

    注意:这是因为整个 SQL语句被转换为单个查询计划。子查询 NOT 获取他们自己的个别查询计划,就好像它们是孤立执行一样。

    使用什么查询计划和连接类型取决于数据结构和每种特定情况下的数据。告诉哪个更快的唯一方法是在受控环境中尝试两者并测量性能......但是,

    2)除非系统遇到性能问题,(不可接受的性能不佳)。清晰度更重要。对于上述问题,(在SQL语句的输出中,“其他”表中不需要任何数据属性),子查询在描述连接的SQL的功能和目的时更加清晰Bys集团将是。

答案 2 :(得分:0)

我认为,从性能的角度来看,接受的解决方案会有问题,假设您拥有许多用户,照片和评论。您的查询为用户表中的每一行运行两个单独的select语句。

您要做的是使用ActiveRecord合成查询,如下所示:

SELECT user.*, COUNT(c.id) + COUNT(p.id) AS total_count
FROM users u LEFT JOIN photos p ON u.id = p.user_id
LEFT JOIN comments c ON u.id = c.user_id
GROUP BY user.id 
ORDER BY total_count DESC

加入会更有效率。使用左连接可确保即使用户没有评论或照片,它们仍将包含在结果中。

答案 3 :(得分:-1)

如果我假设您有一些评论和照片计数(user.number_of_photos,user.number_of_comments;如上所示),那将很简单(不是愚蠢):

Select user_id from user order by number_of_photos DESC, number_of_comments DESC

答案 4 :(得分:-2)

在Ruby On Rails中:


User.find(:all, :order => '((SELECT COUNT(*) FROM photos WHERE user_id=users.id) + (SELECT COUNT(*) FROM classifications WHERE user_id=users.id)) DESC')