【问题标题】:How do I write this darned SQL query?我该如何编写这个该死的 SQL 查询?
【发布时间】:2011-11-11 16:59:24
【问题描述】:

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

该表是 TeamRankings。列如下:

score | qualities_id | team_id | year | source

团队根据特定年份的不同素质进行评分。请注意,可以为给定的团队分配多个分数(每个分数都来自不同的来源)。同样,给定的团队在给定的年份可能根本没有任何分数。

问题来了:

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

我是从 Rails (3.1) 开始的,我可以通过 Active Record 和多个 db 调用以一种愚蠢的方式做到这一点。但我希望能够用纯 SQL 来做。在 Active Record 中获得帮助的奖励积分限制为一次 db 调用。

非常感谢

【问题讨论】:

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


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

      我不确定你是如何通过 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
        )
      

      【讨论】:

        【解决方案3】:

        仅使用 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))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多