Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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 内部联接是否是此处要使用的正确联接?_Mysql_Sql_Join - Fatal编程技术网

Mysql 内部联接是否是此处要使用的正确联接?

Mysql 内部联接是否是此处要使用的正确联接?,mysql,sql,join,Mysql,Sql,Join,我需要为一个用户更新两个不同表中同名的列。该列为userCanMessage userMain userId | userCanMessage 1 | 0 用户设置 userId | userCanMessage | userCanAdd 1 | 0 | 0 整个事情都是这样组织的,这是有充分理由的 如果我想为userId=1更新两个表中的userCanMessage,那么在一个查询中最安全的方法是什么 目前的情况是: update userMa

我需要为一个用户更新两个不同表中同名的列。该列为
userCanMessage

userMain

userId | userCanMessage
1      | 0
用户设置

userId | userCanMessage | userCanAdd
1      | 0              | 0
整个事情都是这样组织的,这是有充分理由的

如果我想为
userId=1
更新两个表中的
userCanMessage
,那么在一个查询中最安全的方法是什么

目前的情况是:

update userMain inner join userSettings on userMain.userId = userSettings.userId 
   set userMain.userCanMessage = 1,
       userSettings.userCanMessage = 1
  where userMain.userId = 1;

这里,
userMain
是用户的主表,
userSettings
是保存设置的表。更新需要影响两个表,首先是
userMain

为什么要使用
JOIN
?让它成为两个简单的查询

$sql1 = "UPDATE userMain SET userCanMessage WHERE userId=?";
$sql2 = "UPDATE userSettings SET userCanMessage WHERE userId=?";

$stmt1 = $db_usag->prepare($sql1);
$stmt2 = $db_usag->prepare($sql2);

$stmt1->bind_param('d', $param);
$stmt2->bind_param('d', $param);

$stmt1->execute();
$stmt2->execute();

$stmt1->close();
$stmt2->close();

不使用两个单独的查询有什么具体原因吗?
整个事情都是以这种方式构造的,这是一个很好的原因。
-也许你应该分享一下原因,跨表复制字段很少是一个好主意。此外,要使用哪种连接取决于如果userId在userSettings中不存在,您希望发生什么。如果userMain中的userId没有在userSettings中退出,您还想更新它吗?@Daniel当用户被设置(验证)时,会在
userMain
以及
userSettings
中创建一条记录。因此,两个表中都会有一条记录。否,
userMain
中的
userId
如果在
userSettings
中找不到,则不应更新。虽然这样的事情不太可能发生。@arunmoezhi让事情变得更容易。对于这个例子,我只使用了一个字段。还有更多。@在这种情况下,jmenezes内部联接没有坏处,因为您是基于用户ID进行更新的,为了加快更新速度,请确保两个表中的数据类型相同,长度相同,例如int(11),并对它们进行索引。