我有三张桌子。此查询将写下正确的答案(使用适当的btv.cas和race.id_zavod表示btv.id_user的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_user` = '607'结果:
| 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 | 但是,当我尝试通过id_user将其聚合到一行时,它返回正确的min btv.cas,但返回错误的join错误的race.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`结果:
| 607 | 512 | 02:58:31 |发布于 2008-12-12 22:08:43
使用GROUP BY时,select-list中的列必须满足以下条件之一:
在GROUP BY中命名
btv.id_user位于聚合函数(例如MIN( btv.cas ) )中)这是查询中的错误:对于btv.id_user的每个值,btv.id_zavod都有很多值。这不满足函数依赖。id_user的每个值在id_zavod中必须只有一个值,才能成为函数依赖。
在一些数据库品牌中,这个查询实际上会给你一个错误。MySQL更灵活,它信任您只命名选择列表中的列,这些列是您在GROUP BY中命名的列的函数依赖项。
下面的查询将返回您想要的内容,即每个id_user的btv.cas的最小值,以及相应的btv.id_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_user值,但cas中的值更小。使用外部联接,因为您正在寻找没有匹配的情况。您可以使用b2.id_user IS NULL进行测试,因为当没有匹配时,外部联接会使所有列都为NULL。
请注意,可能会有平局,因此我们使用主键作为决胜局添加了额外的术语。
您不需要在此查询中使用GROUP BY。这是隐式处理的,因为只有一行满足外部连接条件。
发布于 2008-12-12 21:53:15
您编写的查询:
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或其他人组成的群组。你能告诉我们你真正运行的是什么查询吗?您期望的结果集是什么?
发布于 2008-12-12 21:54:54
尝试:
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'https://stackoverflow.com/questions/364230
复制相似问题