Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql特定查询_Mysql_Sql - Fatal编程技术网

mysql特定查询

mysql特定查询,mysql,sql,Mysql,Sql,我有两张表格:团队和编队: 表团队: team_id | team_name 1 | Barcelona 2 | Real Madrid 3 | PSG formation_id | team_id | module 1 | 2 | 5-3-2 2 | 1 | 4-4-2 3 | 3 | 4-4-2 4 | 2 | 4-4-

我有两张表格:
团队
编队

团队

team_id | team_name
   1    | Barcelona
   2    | Real Madrid
   3    | PSG
formation_id | team_id | module
    1        |    2    | 5-3-2
    2        |    1    | 4-4-2
    3        |    3    | 4-4-2
    4        |    2    | 4-4-3
地层

team_id | team_name
   1    | Barcelona
   2    | Real Madrid
   3    | PSG
formation_id | team_id | module
    1        |    2    | 5-3-2
    2        |    1    | 4-4-2
    3        |    3    | 4-4-2
    4        |    2    | 4-4-3
实际上,我需要按团队id在2个表组之间“连接”,但要使用最后一个“队形id”

结果是:

 team_id | team_name  | formation_id  | module
    1    | Barcelona  |     2         |  4-4-2
    2    | Real Madrid|     4         |  4-4-3
    3    | PSG        |     3         |  4-4-2 
其实我的问题是:

SELECT *
  FROM formations f
 INNER JOIN teams t 
    ON (f.team_id = t.team_id)
 GROUP BY t.team_id
在我的查询中,我为每个团队选择了第一个插入阵型,而必须为每个团队选择最后一个阵型。

您可以写:

SELECT t.team_id,
       t.team_name,
       f.formation_id,
       f.module
  FROM teams t
  JOIN formations f
    ON f.team_id = t.team_id
       -- require f.formation_id to be MAX(formation_id) for some team:
  JOIN ( SELECT MAX(formation_id) AS id
           FROM formations
          GROUP
             BY team_id
       ) max_formation_ids
    ON max_formation_ids.id = f.formation_id
;
或:

或:

你可以写:

SELECT t.team_id,
       t.team_name,
       f.formation_id,
       f.module
  FROM teams t
  JOIN formations f
    ON f.team_id = t.team_id
       -- require f.formation_id to be MAX(formation_id) for some team:
  JOIN ( SELECT MAX(formation_id) AS id
           FROM formations
          GROUP
             BY team_id
       ) max_formation_ids
    ON max_formation_ids.id = f.formation_id
;
或:

或:


SQL规范规定,当使用GROUPBY子句时,输出中的所有字段/表达式都应该是聚合函数的结果(如count、avg等)或GROUPBY子句中列出的字段。否则,不定义行为。因此,如果您需要准确地选择此记录,则需要向查询中添加一些条件。此外,也不能保证简单的“从某个表中选择*”总是以相同的顺序返回行。

SQL规范规定,当使用group by子句时,输出中的所有字段/表达式都应该是聚合函数的结果(如count、avg等)或group by子句中列出的字段。否则,不定义行为。因此,如果您需要准确地选择此记录,则需要向查询中添加一些条件。此外,也不能保证简单的“从某个表中选择*”总是以相同的顺序返回行。

您可以执行以下操作:

select f.*, t.team_name from formations f
  join (select team_id, max(formation_id) as max_formation_id from formations f 
          group by team_id) as mrf on mrf.max_formation_id = f.formation_id
  join teams t on f.team_id = t.team_id

你可以这样做:

select f.*, t.team_name from formations f
  join (select team_id, max(formation_id) as max_formation_id from formations f 
          group by team_id) as mrf on mrf.max_formation_id = f.formation_id
  join teams t on f.team_id = t.team_id

此版本在没有聚合的情况下生成相同的结果,这通常会导致内部排序

SELECT t.team_id,
   t.team_name,
   f.formation_id,
   f.module
FROM teams t
INNER JOIN formations f
    ON f.team_id = t.team_id
LEFT OUTER JOIN formations f2
    ON f2.team_id = t.team_id
   AND f2.formation_id > f.formation_id
WHERE f2.formation_id IS NULL

此版本在没有聚合的情况下生成相同的结果,这通常会导致内部排序

SELECT t.team_id,
   t.team_name,
   f.formation_id,
   f.module
FROM teams t
INNER JOIN formations f
    ON f.team_id = t.team_id
LEFT OUTER JOIN formations f2
    ON f2.team_id = t.team_id
   AND f2.formation_id > f.formation_id
WHERE f2.formation_id IS NULL
检查此项

检查此项


您可以使用稍后将其与原始表联接的子查询来查找它们的最大编队ID。试试这个

SELECT  a.*, c.formation_ID, c.`module`
FROM    teams a
        INNER JOIN
        (
            SELECT team_id, MAX(formation_ID) maxID
            FROM formations
            GROUP BY team_ID
        ) b ON  a.team_id = b.team_id
        INNER JOIN formations c
            ON  c.team_id = b.team_id AND
                c.formation_ID = b.maxID
ORDER BY a.Team_id

您可以使用稍后将其与原始表联接的子查询来查找它们的最大编队ID。试试这个

SELECT  a.*, c.formation_ID, c.`module`
FROM    teams a
        INNER JOIN
        (
            SELECT team_id, MAX(formation_ID) maxID
            FROM formations
            GROUP BY team_ID
        ) b ON  a.team_id = b.team_id
        INNER JOIN formations c
            ON  c.team_id = b.team_id AND
                c.formation_ID = b.maxID
ORDER BY a.Team_id

当你说“最后”时,你是指“最大的”?不是最大的,每个队的最后队形\u id当你说“最后”时,你是指“最大的”?不是最大的,每个团队的最后形成\u id该子查询中不必要的开销量取决于优化器是否足够聪明,可以只执行一次子查询并将其内容重新用于联接生成的所有行,或者是否决定放弃并重新执行联接的每一行的子查询。我的经验是,即使是WHERE子句中引用的不相关子查询,如本答案中的子查询,通常也会被丢弃,并针对每个符合条件的行重新计算。如果这里也是这种情况,那么绑定到t.team_id的相关子查询将以更便宜的价格生成相同的结果。@FredSobotka:只要OP使用的是最新版本的MySQL,它就应该可以了:优化器将其转换为半联接。@ruakh:我不确定(甚至MySQL 5.5)是否会有如此聪明的行为。我认为只有MariaDB(5.3和5.5)优化器足够好,可以计算一次子查询。(也可能是MySQL 5.6,但这仍然是测试版)@FredSobotka:Hmm,没关系;我刚刚通读了一遍,结果发现,即使是最新版本的MySQL也无法在风格的半联接中为
使用哈希联接。我已经相应地调整了我的答案。@ypercube:谢谢你的+1,谢谢你的轻推!请参阅我前面对FredSobotka的评论。该子查询中不必要的开销取决于优化器是否足够聪明,可以只执行一次子查询,并将其内容重新用于联接生成的所有行,或者是否决定放弃并重新执行联接的每一行的子查询。我的经验是,即使是WHERE子句中引用的不相关子查询,如本答案中的子查询,通常也会被丢弃,并针对每个符合条件的行重新计算。如果这里也是这种情况,那么绑定到t.team_id的相关子查询将以更便宜的价格生成相同的结果。@FredSobotka:只要OP使用的是最新版本的MySQL,它就应该可以了:优化器将其转换为半联接。@ruakh:我不确定(甚至MySQL 5.5)是否会有如此聪明的行为。我认为只有MariaDB(5.3和5.5)优化器足够好,可以计算一次子查询。(也可能是MySQL 5.6,但这仍然是测试版)@FredSobotka:Hmm,没关系;我刚刚通读了一遍,结果发现,即使是最新版本的MySQL也无法在
风格的半联接中为
使用哈希联接。我已经相应地调整了我的答案。@ypercube:谢谢你的+1,谢谢你的轻推!见我之前对FredSobotka的评论。