各ユーザーは写真があり、多くのコメントがあります。 より多くの商品でユーザーを選択
SUM(number_of_photos, number_of_comments)
私はSQLクエリを提案できますか?
ルビーオンレールで各ユーザーは写真があり、多くのコメントがあります。 より多くの商品でユーザーを選択
SUM(number_of_photos, number_of_comments)
私はSQLクエリを提案できますか?
ルビーオンレールで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
主キーがあります)。
DISTINCTをCOUNT文に追加するのを忘れてしまった;) – collimarco
:
User.find(:all, :order => '((SELECT COUNT(*) FROM photos WHERE user_id=users.id) + (SELECT COUNT(*) FROM classifications WHERE user_id=users.id)) DESC')
私はあなたがコメントの数や写真(user.number_of_photos、user.number_of_comments;上記見られるように)の数を持っていたと仮定した場合、それは次のようになります簡単な(愚かではない):
Select user_id from user order by number_of_photos DESC, number_of_comments DESC
Select * From Users U
Order By (Select Count(*) From Photos
Where userId = U.UserId) +
(Select Count(*) From Comments
Where userId = U.UserId)
EDIT:サブクエリを使用して、すべてのクエリが使用してもを行うことができますが速くなりますこれ、参加、
注:これは、のSQL文全体が単一のクエリプランに変換されているためです。サブクエリはではないは、単独で実行されているかのように独自の個別のクエリプランを取得します。
どのようなクエリプランおよびどのタイプの結合が使用されるかは、それぞれの特定の状況におけるデータ構造とデータによって異なります。どちらが速いのかを判断する唯一の方法は、制御された環境で性能を測定することです。ただし、
2)システムでパフォーマンスに問題が発生していない限り(許容できないパフォーマンス低下)。明快さがより重要です。また、上記のような問題(SQL文の出力に「その他」の表のデータ属性が必要ない場合)では、副問合せはSQLの機能と目的を説明する上で、
多くのユーザー、写真、コメントがあると仮定すると、パフォーマンスの観点から問題が解決されると考えられます。クエリでは、ユーザーテーブルの各行に対して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の
解決しました。愚かな質問を申し訳ありません:( – collimarco
答えを探している人がいれば、私の答えをくれました。 –