1

我有三张桌子。此查询将写下正确答案(btv.id_user 的 x 行,带有适当的 btv.cas 和 race.id_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'

结果:

| 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 但错误的加入错误的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 |
4

5 回答 5

1

您编写的查询:

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-12T21:53:14.770 回答
0

尝试:

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'
于 2008-12-12T21:54:54.280 回答
0

当您使用 GROUP BY 时,选择列表中的列必须满足以下条件之一:

  • 列在 GROUP BY 中命名(例如btv.id_user在您的示例中)
  • 列在聚合函数内(例如MIN( btv.cas )
  • 列是您在 GROUP BY 中命名的列的功能依赖项。

这是您的查询中的错误: btv.id_zavod每个值都有很多值btv.id_user。这不满足功能依赖。id_zavod的每个值必须只有一个值,id_user才能成为函数依赖项。

在某些数据库品牌中,此查询实际上会给您一个错误。MySQL 更加灵活,相信您只命名选择列表中的列,这些列是您在 GROUP BY 中命名的列的功能依赖项。

这是一个查询,它返回您想要的,btv.casper的 MIN 值id_user,对应的值为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。使用 OUTER JOIN,因为您正在寻找不匹配的情况。您可以使用 进行测试b2.id_user IS NULL,因为 OUTER JOIN 在不匹配时使所有列都为 NULL。

请注意,可能存在平局,因此我们使用主键作为平局者添加额外的术语。

您不需要在此查询中使用 GROUP BY。这是隐式处理的,因为只有一行满足 OUTER JOIN 条件。

于 2008-12-12T22:08:42.693 回答
0

我不确定您要完成什么,但您是否正在寻找GROUP_CONCAT 功能??

于 2008-12-12T22:14:01.827 回答
0

您是否只是试图获取最低 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
于 2008-12-13T01:38:41.490 回答