当前位置: 首页 > 知识库问答 >
问题:

SQL:在没有重写行的联接后按分组?

党建义
2023-03-14

我有一个篮球联赛表,一个af队表和一个球员表,像这样:

LEAGUES
ID   |   NAME    |
------------------
1    |   NBA     |
2    |   ABA     |

TEAMS:
ID   |   NAME    |  LEAGUE_ID
------------------------------
20   |   BULLS   |    1
21   |   KNICKS  |    2

PLAYERS:
ID   |   TEAM_ID  |  FIRST_NAME | LAST_NAME | 
---------------------------------------------
1    |      21    |   John      |  Starks   |    
2    |      21    |   Patrick   |  Ewing    |    

给定一个联盟ID,我想从该联盟的所有球队中检索所有球员的名字和他们的球队ID,所以我这样做:

SELECT t.id AS team_id, p.id AS player_id, p.first_name, p.last_name
FROM teams AS t
JOIN players AS p ON p.team_id = t.id
WHERE t.league_id =  1
[0] => stdClass Object
    (
        [team_id] => 21
        [player_id] => 1
        [first_name] => John
        [last_name] => Starks
    )

[1] => stdClass Object
    (
        [team_id] => 21
        [player_id] => 2
        [first_name] => Patrick
        [last_name] => Ewing
    )

+ around 500 more objects...
SELECT t.id AS team_id, p.id AS player_id, p.first_name, p.last_name
FROM teams AS t
JOIN players AS p ON p.team_id = t.id
WHERE t.league_id =  1
GROUP BY t.id
[0] => stdClass Object
    (
        [team_id] => 21
        [player_id] => 2
        [first_name] => Patrick
        [last_name] => Ewing
    )
[1] => stdClass Object
    (
        [team_id] => 22
        [player_id] => 31
        [first_name] => Shawn
        [last_name] => Kemp
    )
etc...
[0] => stdClass Object
    (
        [team_id] => 2

        [player_id1] => 1
        [first_name1] => John
        [last_name1] => Starks
        [player_id2] => 2
        [first_name2] => Patrick
        [last_name2] => Ewing

        +10 more players from this team...
    )

    +25 more teams...

共有1个答案

赫连飞沉
2023-03-14

在SQL中不能这样做,因为不能以数据集的形式表示结果。您希望返回复杂对象。您可以做的是在代码中处理这个问题,并通过返回一个按team_id排序的数据集来帮助您自己。每当team_id发生变化时,就应该在代码中创建新的对象,并用新的球员列表填充它。

应该是这样的(语法可能不正确):

返回的结果集:

team_id|player_id|first|last
1|1|f1|l1
1|2|f2|l2
1|3|f3|l3
2|5|f5|l5
2|6|f6|l6

当它在代码中返回时

$lastTeamId=0;
$output=array();
foreach($results as $row){
  if($lastTeamId != $row["team_id"]){
    $lastTeamId = $row["team_id"];
    $output[$lastTeamId] = array();
  }

  $newPlayer = null;
  $newPlayer->id = $row["player_id"];
  $newPlayer->first = $row["first"];
  $newPlayer->last = $row["last"];
  $output[$lastTeamId][] = $newPlayer;
}
 类似资料:
  • 我有两张桌子:订单 订单详情 产品介绍 我想在product_ID1和4的订单详细信息中找到所有记录(因此尝试查看一个订单何时包含这两种产品)。因此运行此代码-INNER JOIN创建一个结果表,该表仅包含包含产品1、4或1和4的订单。 然后我要计算所有“订单详细信息”。order\u ID重复-这些是包含1和4的所有订单(注意-普通数据库-给定订单包含的产品不超过1个)。 这是我的代码-不太管用

  • 问题内容: 我有下表: 现在,我想为每个用户创建所有可能的语言对,这意味着我希望结果集为:对于用户1:(2,7),(7,8),(2,8) 对于用户2:(10,3) 为此,我已经完成了以下查询: 我得到的结果是针对用户1的:(2,7),(7,8),(2,8),(7,2),(8,7),(8,2) 对于用户2:(10,3),(3,10) (10,3)和(3,10)对我来说没有区别 如何删除重复的行? t

  • 问题内容: 我有两张桌子。表A列出了员工姓名。表B是一个复杂的表,其中包含有关员工打来的电话的信息。 我的目标是制作一个包含“名称”和“ callCount”列的表。我的目标是“左加入”和“分组依据”,但是我一直想念没有打过电话的员工。我怎样才能只保留名称并在其中放置零? 也许我很亲密,有人可以指出我的错字吗?在此先感谢您的帮助,以下是SQL: 问题答案: 这是一个JOIN而非NULL问题:您的过

  • 我正在使用spring data JPA,我想在我的存储库中编写一个SQL查询。 我有一个下面的SQL查询(注意左边的连接): 我想在我的机构存储库中执行它,如下所示: 我想要的内容:(在此查询中,id设置为1,用于表示目的) 我看过很多这样的问题和答案(比如这一个),但我还没能找到答案。 那么,我如何编写这个查询,以便得到我想要的东西呢? 我得到了一个例外: mysqlsyntaxerrorex

  • 问题内容: 无论性能如何,我从下面的查询A和B中都能得到相同的结果吗?C和D呢? 问题答案: 对于联接,不,顺序无关紧要。该查询将返回相同的结果,只要你改变你的选择来。 对于(,或)连接,是的,顺序是有意义的-和( 更新 )事情要复杂得多。 首先,外部联接不是可交换的,因此与 外部联接也不是关联的,因此在您的示例中同时涉及(可交换性和关联性)两个属性: 等效于 : 但: 不等同于 : 另一个(希望

  • 我解释我这篇文章的目标。 实际上,我想重写如何Android工作的基本上,与应用程序中的字符串。此时此刻,我可以从重写android资源中动态更改它 实际上,我有这个功能,只有当我使用时才能正常工作: 有一种简单的方法,不需要太多代码,就可以覆盖xml中的行为?