MySQL和聚合中的表联接问题
我有三张桌子。此查询将写下正确答案(对于具有适当btv.cas和race.id\u zavod的btv.id\u用户的x行)MySQL和聚合中的表联接问题,sql,mysql,join,Sql,Mysql,Join,我有三张桌子。此查询将写下正确答案(对于具有适当btv.cas和race.id\u zavod的btv.id\u用户的x行) SELECT `btv.id_user`, `btv.id_zavod`,`btv.cas` FROM `btv` JOIN `btu` ON `btv.id_user` = `btu.id_user` JOIN `race` ON 'btv.id_zavod' = `race.id_zavod` WHERE `race.type` = '8' AND `btv.id_u
SELECT `btv.id_user`, `btv.id_zavod`,`btv.cas`
FROM `btv`
JOIN `btu` ON `btv.id_user` = `btu.id_user`
JOIN `race` ON 'btv.id_zavod' = `race.id_zavod`
WHERE `race.type` = '8' AND `btv.id_user` = '607'
SELECT `btv.id_user`, `btv.id_zavod`, MIN( `btv.cas` )
FROM `btv`
JOIN `btu` ON `btv.id_user` = `btu.id_user`
JOIN `race` ON 'btv.id_zavod' = `race.id_zavod`
WHERE `race.type` = '8' AND `btv.id_user` = '607'
GROUP BY `btv.id_user`
结果:
| 607 | 512 | 03:15:58 |
| 607 | 730 | 03:01:18 |
| 607 | 164 | 03:07:26 |
| 607 | 767 | 02:58:31 |
| 607 | 1147 | 03:06:47 |
| 607 | 1149 | 03:09:41 |
| 607 | 1178 | 03:24:20 |
| 607 | 512 | 02:58:31 |
但是当我试图通过id\u用户将其聚合到一行时,它返回正确的min btv.cas,但返回错误的join错误的race.id\u zavod
SELECT `btv.id_user`, `btv.id_zavod`,`btv.cas`
FROM `btv`
JOIN `btu` ON `btv.id_user` = `btu.id_user`
JOIN `race` ON 'btv.id_zavod' = `race.id_zavod`
WHERE `race.type` = '8' AND `btv.id_user` = '607'
SELECT `btv.id_user`, `btv.id_zavod`, MIN( `btv.cas` )
FROM `btv`
JOIN `btu` ON `btv.id_user` = `btu.id_user`
JOIN `race` ON 'btv.id_zavod' = `race.id_zavod`
WHERE `race.type` = '8' AND `btv.id_user` = '607'
GROUP BY `btv.id_user`
结果:
| 607 | 512 | 03:15:58 |
| 607 | 730 | 03:01:18 |
| 607 | 164 | 03:07:26 |
| 607 | 767 | 02:58:31 |
| 607 | 1147 | 03:06:47 |
| 607 | 1149 | 03:09:41 |
| 607 | 1178 | 03:24:20 |
| 607 | 512 | 02:58:31 |
您编写的查询:
SELECT `btv.id_user`, `btv.id_zavod`, MIN( `btv.cas` )
FROM `btv`
JOIN `btu` ON `btv.id_user` = `btu.id_user`
JOIN `race` ON 'btv.id_zavod' = `race.id_zavod`
WHERE `race.type` = '8' AND `btv.id_user` = '607'
GROUP BY `btv.id_user`
无法运行。您需要一个id为zavod的组或其他什么。您能告诉我们您真正运行的是什么查询吗?您希望得到什么结果集吗?您编写的查询:
SELECT `btv.id_user`, `btv.id_zavod`, MIN( `btv.cas` )
FROM `btv`
JOIN `btu` ON `btv.id_user` = `btu.id_user`
JOIN `race` ON 'btv.id_zavod' = `race.id_zavod`
WHERE `race.type` = '8' AND `btv.id_user` = '607'
GROUP BY `btv.id_user`
无法运行。您需要一个id为zavod的组或其他什么。您能告诉我们您真正运行的是什么查询吗?以及您期望的结果集是什么吗?请尝试:
SELECT `btv.id_user`, `btv.id_zavod`, MIN( `btv.cas` )
FROM `btv`
Inner JOIN `btu` ON `btv.id_user` = `btu.id_user`
Inner JOIN `race` ON 'btv.id_zavod' = `race.id_zavod`
WHERE `btv.id_user` = '607'
GROUP BY `btv.id_user` having `race.type` = '8'
尝试:
使用“分组依据”时,“选择”列表中的列必须满足以下条件之一:
- 列在组中的名称为(例如,在您的示例中,
)btv.id\u user
- 列位于聚合函数内(例如
)MIN(btv.cas)
- Column是您在GROUP BY中命名的列的函数依赖项
btv.id\u zavod
对于btv.id\u user
的每个值都有许多值。这不满足函数依赖性。对于id\u user
的每个值,id\u zavod
中必须只有一个值才能成为函数依赖性
在某些数据库品牌中,此查询实际上会给您一个错误。MySQL更灵活,它只允许您在选择列表中指定与您在GROUP BY中命名的列的功能相关性的列
这里有一个查询,返回您想要的内容,即每个id\u用户的btv.cas
的最小值,以及相应的btv.id\u zavod
:
SELECT b1.id_user, b1.id_zavod, b1.cas
FROM btv AS b1
JOIN btu ON (b1.id_user = btu.id_user)
JOIN race ON (b1.id_zavod = race.id_zavod)
LEFT OUTER JOIN btv AS b2 ON (b1.id_user = bt2.id_user AND
(b1.cas > b2.cas OR (b1.cas = b2.cas AND b1.primarykey > b2.primarykey))
WHERE race.type = '8' AND b1.id_user = '607'
AND b2.id_user IS NULL;
换句话说,您需要像以前一样进行连接,但随后再次将其连接到btv
,以查看是否有另一行具有相同的id\u user
值,并且cas
中的值较小。使用外部连接,因为您正在寻找不匹配的情况。您可以使用b2.id\u user为NULL,因为外部联接在不匹配时使所有列都为空
请注意,可能存在绑定,因此我们使用主键作为绑定断开器添加了额外的项
您不需要在此查询中使用GROUP BY。这是隐式处理的,因为只有一行满足外部联接条件。使用GROUP BY时,选择列表中的列必须满足以下条件之一:
- 列在组中的名称为(例如,在您的示例中,
btv.id\u user
)
- 列位于聚合函数内(例如
MIN(btv.cas)
)
- Column是您在GROUP BY中命名的列的函数依赖项
这是您的查询中的错误:btv.id\u zavod
对于btv.id\u user
的每个值都有许多值。这不满足函数依赖性。对于id\u user
的每个值,id\u zavod
中必须只有一个值才能成为函数依赖性
在某些数据库品牌中,此查询实际上会给您一个错误。MySQL更灵活,它只允许您在选择列表中指定与您在GROUP BY中命名的列的功能相关性的列
这里有一个查询,返回您想要的内容,即每个id\u用户的btv.cas
的最小值,以及相应的btv.id\u zavod
:
SELECT b1.id_user, b1.id_zavod, b1.cas
FROM btv AS b1
JOIN btu ON (b1.id_user = btu.id_user)
JOIN race ON (b1.id_zavod = race.id_zavod)
LEFT OUTER JOIN btv AS b2 ON (b1.id_user = bt2.id_user AND
(b1.cas > b2.cas OR (b1.cas = b2.cas AND b1.primarykey > b2.primarykey))
WHERE race.type = '8' AND b1.id_user = '607'
AND b2.id_user IS NULL;
换句话说,您需要像以前一样进行连接,但随后再次将其连接到btv
,以查看是否有另一行具有相同的id\u user
值,并且cas
中的值较小。使用外部连接,因为您正在寻找不匹配的情况。您可以使用b2.id\u user为NULL,因为外部联接在不匹配时使所有列都为空
请注意,可能存在绑定,因此我们使用主键作为绑定断开器添加了额外的项
您不需要在此查询中使用GROUP BY。这是隐式处理的,因为只有一行满足外部联接条件。我不确定您要实现什么,但您是否正在寻找?我不确定您要实现什么,但您是否正在寻找?您是否正在寻找您只是试图获取最低的btv.cas值及其对应的其他列?如果是这样,您只需按btv.cas排序并限制为1次点击:
SELECT `btv.id_user`, `btv.id_zavod`,`btv.cas`
FROM `btv`
JOIN `btu` ON `btv.id_user` = `btu.id_user`
JOIN `race` ON 'btv.id_zavod' = `race.id_zavod`
WHERE `race.type` = '8' AND `btv.id_user` = '607'
ORDER BY `btv.cas` LIMIT 1
您只是想获取最低的btv.cas值及其对应的其他列吗?如果是这样,您可以按btv.cas排序并限制为1次点击:
SELECT `btv.id_user`, `btv.id_zavod`,`btv.cas`
FROM `btv`
JOIN `btu` ON `btv.id_user` = `btu.id_user`
JOIN `race` ON 'btv.id_zavod' = `race.id_zavod`
WHERE `race.type` = '8' AND `btv.id_user` = '607'
ORDER BY `btv.cas` LIMIT 1
没错,这将适用于此选择,但稍后我想对所有用户使用此选择(为所有用户查找最小CA和对应的id_zavod)。没错,这将适用于此选择,但稍后我想对所有用户使用此选择(为所有用户查找最小CA和对应的id_zavod)