Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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和聚合中的表联接问题_Sql_Mysql_Join - Fatal编程技术网

MySQL和聚合中的表联接问题

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

我有三张桌子。此查询将写下正确答案(对于具有适当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_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)