【问题标题】:Select records from joint tables从联合表中选择记录
【发布时间】:2025-12-06 15:40:01
【问题描述】:

有两张桌子:

tblJumper
  JumperID
  JumperName  

tblWidthScored
  ScoreID
  fkJumperID
  fkScoredWidth

tblWidthScored.fkJumperID = tblJumper.JumperID相关的表

表格包含以下数据:

tblJumper
  1   Tom
  2   Jerry
  3   Bugs
tblWidthScored
  1   1   5,72m
  2   2   6,13m 
  3   1   5,80m 
  4   3   6,40m
  5   2   6,30m
  6   3   6,20m

我想要得到的是每个 Jumpers 人物的最佳列表:

  Tom    5,80m
  Jerry  6,30m
  Bugs   6,40m

尝试了各种形式的 SELECT DISTINCT... 但没有成功。 任何人都可以给一个提示,好吗? 谢谢!

【问题讨论】:

    标签: sql select distinct


    【解决方案1】:

    虽然我认为这只是一个加入问题,并且可以在网络上找到合适的文章,但我会发布其中一个答案...

     SELECT
      J.JumperName,
      S.Score
     FROM tblJumper as J
       INNER JOIN(
                   SELECT
                     fkJumperID, 
                     Max(fkScoredWidth) as Score 
                   FROM tblWidthScored 
                   GROUP BY
                     fkJumperID
                 ) as S on J.JumperID = S.fkJumperID
    

    您要求的提示实际上在您的实际问题中:

    您正在努力寻找个人最好成绩!这意味着某种聚合:Maximum

    您正在努力寻找个人最好成绩。不是“所有跳投者中的最好成绩”,而是每个人的个人最好成绩。这意味着某种区分或分组,您可以按人划分分数数据:Group By Clause

    【讨论】:

    • 感谢您的帮助 - 以及有关如何找到它的详细信息。没有考虑“分组依据”,所以甚至没有找到正确的方向。
    • 不客气。如果我能帮上忙,我会很高兴;)因为您提供了反馈并做了一些研究(我猜 :)),所以我放弃了我的反对票,而反对票就是为此;并恳请您接受其中一个答案作为正确答案。由于我们都采用相同的方法并给出相同的答案,因此您可以选择其中之一;没关系,因为正确的是Group By
    • 你好,The_aLiEn!所以 - 如果你觉得你想“否决”我 - 这意味着什么 - 为什么不做一个男人并坚持下去。我已经做了很长一段时间的研究——正如你在精彩的解释中所说:这都是我的问题。从您的图片中,我可能会说我甚至在您出生之前就开始使用 dBase 和 sql,并且在过去的几十年中丢失了一些东西。我什至没有朝正确的方向看。你做得很好,指出了如何得到答案。也许你可能会认为有人在圣诞节问了一个问题(一切都在我的问题日期 - 凌晨 1 点 20 分!)...
    • ... 可能不仅仅是从一顿美味的饭菜中醒来,想着如何用一个愚蠢的问题让辛勤工作的支持者感到不安 :-) 几十年来,有九名客户打电话给“我的打印机不打印” “通过重新插入在房间的一些celaning期间掉下来的电源来让它恢复工作。就像那样。所以 - 再说一遍:你是个好老师 - 你可以保留我的“缺点”,并且在经过数小时、数天和数天无果的研究后,对下一个寻求帮助的人更有耐心,只是因为他看错了方向并且没有人可以在下一张桌子上问。我就离开了
    • 投反对票意味着我给你的问题打了一个减分,因为它应该得到它所显示的缺乏研究,而不是它可能包括一些。而且我认为,这不是我会坚持与否的男子气概,而是这个社区正在努力的事情。你对他们不值得提出的问题和答案投了反对票。先生,当您在两个半月后提供反馈时,我认为我足够有礼貌,可以诚实坦率地说我收回并放弃了一个,即使这是一个答案不被接受的问题;这就是这个社区的运作方式:...
    【解决方案2】:

    你可以试试这个查询。对于这种类型的查询,您必须使用 Group BY 子句和子查询。

     SELECT JumperName, innertblWidthScored
     FROM tblJumper INNER JOIN(SELECT fkJumperID, 
                   Max(fkScoredWidth) as innertblWidthScored
                   FROM tblWidthScored 
                   GROUP BY fkJumperID) WidthScored 
     on tblJumper.JumperID = WidthScored.fkJumperID
    

    SQL FIDDLE DEMO

    【讨论】:

      【解决方案3】:

      您也可以从JOIN 开始,然后再执行GROUP BY。如果您的示例输出确实建议了排序顺序,您还需要一个 ORDER BY

      SELECT
        JumperName
        , MAX(fkScoredWidth) PersonalBest
      FROM tblJumper
      JOIN tblWidthScored
        ON JumperID = fkJumperID
      GROUP BY JumperName
      ORDER BY MAX(fkScoredWidth) DESC;
      

      SQL Fiddle

      【讨论】:

      • 这是我没想到的Group By。感谢您的帮助!
      【解决方案4】:

      从结果来看,您似乎想找回得分最高的跳线

      试试这个 -

      select
        a.jumperName,
        b.bestScore
      from tblJumper a, (
                          select
                            max(fkScoredWidth) as bestScore,
                            fkJumperID
                          from tblWidthScored
                          group by
                            fkJumperID
                        ) b on b.fkJumperID = a.JumperID
      order by
        a.JumperID
      

      【讨论】:

        最近更新 更多