如何编写这个darned SQL查询?

时间:2011-11-11 16:59:24

标签: sql activerecord ruby-on-rails-3.1

我是一个相对sql的通知,渴望学习,但我需要一些帮助来组合查询。如果有人能引导我朝着正确的方向前进,我将不胜感激。

该表是TeamRankings。列如下:

score | qualities_id | team_id | year | source

团队在特定年份的不同品质方面得分。请注意,可以为给定团队分配多个分数(每个分数来自不同的来源)。同样,给定的团队在给定年份可能根本没有任何分数。

问题在于:

鉴于单一质量和团队清单,我想找到一个年份列表,其中每个团队至少有一个分数。

我是从Rails(3.1)开始的,我可以用Active Record和多个db调用来做这个愚蠢的方式。但我希望能够在纯SQL中完成。奖励指向Active Record中的帮助,限制为一个db调用。

非常感谢

3 个答案:

答案 0 :(得分:1)

以下是您有6支球队的例子。您在HAVING子句中测试的值(在我的示例中为6)应该与IN子句中包含的team_id数相匹配。

SELECT year
    FROM TeamRankings
    WHERE qualities_id = 1
        AND team_id IN (4,8,15,16,23,42)
    GROUP BY year
    HAVING COUNT(DISTINCT team_id) = 6;

答案 1 :(得分:1)

我不确定你是如何通过Ruby传递参数的,但这里有一些SQL。您可能希望加入Teams表以获取团队名称。不包含在您的架构中,但是......

Select Distinct tr.Team_id, t.TeamName, tr.Year
From TeamRankings tr
  Inner Join Teams t
Where Exists (
  Select 1 From TeamRankings 
  Where Team_id=tr.TeamID and Year=tr.Year and qualityID=@qualityid
  )

答案 2 :(得分:1)

仅使用SQL,您需要将数据分组为yar,然后使用HAVING子句检查每个团队是否存在...

SELECT
  year
FROM
  TeamRankings
WHERE
  team_id IN (<your_list>)
  AND qualities_id = <your quality id>
GROUP BY
  year
HAVING
  COUNT(DISTINCT team_id) = <your number of teams>


有趣的是如何将列表传递给SQL查询。我通常的习惯是传递一个以逗号分隔的id'字符串,然后将一个sql函数拆分为一个记录集。它当然不会感觉优雅,但我遇到了更多,嗯,新颖的解决方案......

SELECT
  year
FROM
  TeamRankings
INNER JOIN
  dbo.my_split_function(@list_of_ids) AS Team
    ON Team.id = TeamRankings.team_id
WHERE
  qualities_id = @quality_id
GROUP BY
  year
HAVING
  COUNT(DISTINCT team_id) = (SELECT COUNT(DISTINCT id) FROM dbo.my_split_function(@list_of_ids))