RoR アプリケーションで結合したい 2 つの PostgreSQL ステートメントがあります。
最初の SQL ステートメントは、2 つの特定の tag_id を含むリンクを返します。
SELECT link_id, count(*) as counter
FROM "totals"
WHERE "totals"."tag_id" IN (6, 8)
AND (score > 0)
GROUP BY link_id
HAVING count(*)=2
RoR ActiveRecord バージョン:
links = Total.find_all_by_tag_id(@tag_list, :conditions => ["score > 0"], :select => "link_id, count(*) as counter", :having => "count(*)=#{@tag_list.count}", :group => "link_id").collect(&:link_id).uniq.sort.reverse
2 番目の SQL ステートメントは、特定の tag_id のスコアが最も高いリンクを返します。
SELECT s1.link_id
FROM totals AS s1
, (SELECT link_id
, MAX(score) AS maxscore
FROM totals
GROUP BY link_id) as s2
WHERE s2.link_id = s1.link_id
and s1.score = s2.maxscore
AND s1.score > 0 AND s1.tag_id = 6
テーブルは次のように構成されます。
totals:
link_id : integer
tag_id : integer
score : integer
=============================
| link_id | tag_id | score |
=============================
| 1 | 6 | 5 |
| 1 | 8 | 2 |
| 1 | 3 | 1 |
| 2 | 6 | 6 |
| 2 | 4 | 2 |
| 2 | 8 | 6 |
| 3 | 6 | 5 |
| 3 | 2 | 4 |
| 4 | 2 | 4 |
| 4 | 6 | 1 |
| 4 | 8 | 2 |
=============================
最初の SQL ステートメントは を返しlink_ids
1, 2 and 4
、2 番目の SQL ステートメントは を返しlink_ids
1, 2 and 3
ます。
複数の選択されたタグを含む特定のタグの最高スコアを取得するために、2 つの SQL ステートメントを 1 つに結合するにはどうすればよいですか?
結合されたステートメントは、link_ids
1 and 2
.
DDL および INSERT コマンドは、http ://sqlize.com/480glD5Is4 にあります。
これが RoR ActiveRecord スタイルまたはより最適な SQL ステートメントで記述できれば素晴らしいことです。
どうもありがとう。