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的评论。