2009-07-26 7 views
0

各ユーザーは写真があり、多くのコメントがあります。 より多くの商品でユーザーを選択

SUM(number_of_photos, number_of_comments)

私はSQLクエリを提案できますか?

ルビーオンレールで
+0

解決しました。愚かな質問を申し訳ありません:( – collimarco

+0

答えを探している人がいれば、私の答えをくれました。 –

答えて

5

GROUP BYは、(すべてのリレーショナルDBの中で私が知っている)に依存サブクエリよりも効率的に動作します:テーブル上のいくつかの仮定と

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主キーがあります)。

+0

DISTINCTをCOUNT文に追加するのを忘れてしまった;) – collimarco

-2


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

私はあなたがコメントの数や写真(user.number_of_photos、user.number_of_comments;上記見られるように)の数を持っていたと仮定した場合、それは次のようになります簡単な(愚かではない):

Select user_id from user order by number_of_photos DESC, number_of_comments DESC

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

EDIT:サブクエリを使用して、すべてのクエリが使用してもを行うことができますが速くなりますこれ、参加、

  1. は、
  2. 単純な質問ではなく、システムが 経験し、パフォーマンス上の問題でない限りは無関係です。
1)どちらの構造も、クエリオプティマイザによって、何らかのタイプの相関結合、ネストループ結合、ハッシュ結合、マージ結合などのクエリプランに変換する必要があります。そして、両方が同じクエリプランになることは完全に可能です(おそらく)。

注:これは、のSQL文全体が単一のクエリプランに変換されているためです。サブクエリはではないは、単独で実行されているかのように独自の個別のクエリプランを取得します。

どのようなクエリプランおよびどのタイプの結合が使用されるかは、それぞれの特定の状況におけるデータ構造とデータによって異なります。どちらが速いのかを判断する唯一の方法は、制御された環境で性能を測定することです。ただし、

2)システムでパフォーマンスに問題が発生していない限り(許容できないパフォーマンス低下)。明快さがより重要です。また、上記のような問題(SQL文の出力に「その他」の表のデータ属性が必要ない場合)では、副問合せはSQLの機能と目的を説明する上で、

0

多くのユーザー、写真、コメントがあると仮定すると、パフォーマンスの観点から問題が解決されると考えられます。クエリでは、ユーザーテーブルの各行に対して2つの個別のSELECT文が実行されます。

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 

は何がやりたいことは、このように見えるのActiveRecordを使用してクエリを合成です

参加はずっと効率的です。左の結合を使用すると、ユーザーがコメントや写真を持たなくても、結果に含まれることになります。 JOINの