具有多个 WHERE 和 SELECT 条件的更新 - MySql

Posted

技术标签:

【中文标题】具有多个 WHERE 和 SELECT 条件的更新 - MySql【英文标题】:UPDATE with multiple WHERE and SELECT condition - MySql 【发布时间】:2018-12-05 11:31:56 【问题描述】:

所以,我有两个表 ativoscolaboradores,它们在我的更新页面上通过 id_colaborador (FK) 链接,我可以更改 id_colaborador 但不是更改 ID 我想write the nameID 匹配,但我认为我需要多个 WHERE 条件和 SELECT,有人可以帮帮我吗?谢谢! 我有以下代码要更新

$sql = "UPDATE ativos  SET ativo = ?, comentario = ?, data_aquisicao = ?, localizacao = ?, fabricante = ?, modelo = ?, imei = ?, 
    numero_serie = ?, ativo_sap = ?, anexo_a = ?, evento = ?, data_evento = ?, SELECT id_colaborador FROM colaboradores WHERE nome = ? AND WHERE id_ativo = ?";

更新 我已经尝试将这两个语句分开:

$sql = "UPDATE ativos  SET ativo = ?, comentario = ?, data_aquisicao = ?, localizacao = ?, fabricante = ?, modelo = ?, imei = ?, 
        numero_serie = ?, ativo_sap = ?, anexo_a = ?, evento = ?, data_evento = ?, id_colaborador = ? WHERE id_ativo = ?";
        $sql2 = "SELECT id_colaborador FROM colaboradores WHERE nome = ?";
        $q = $pdo->prepare($sql,$sql2);

但它给了我以下错误:

警告:PDO::prepare() 期望参数 2 为数组,字符串在 C:\xampp\htdocs\gestao\Colaboradores\ativo_update.php 第 120 行给出

致命错误:未捕获的错误:调用 C:\xampp\htdocs\gestao\Colaboradores\ativo_update.php:121 中布尔值的成员函数 execute() 堆栈跟踪:#0 main 在 C:\xampp 中抛出\htdocs\gestao\Colaboradores\ativo_update.php 在第 121 行

【问题讨论】:

您是在用SELECT 询问WHERE IN 吗?你能澄清一下你的意思吗? 您通常不能在同一个语句中进行选择和更新。您应该使用两个单独的语句,一个用于更新,一个用于选择。 我的意思是,我认为我需要两个WHERE 条件和一个SELECT 来获取我想从colaboradores 输入的名称,而不是输入id_colaborador 即我的FK . @TimBiegeleisen 但我可以用INSERT INTO 做到这一点,为什么我不能在UPDATE 上做到这一点? 而不是你为什么不给用户一个下拉列表或一个可以返回所有可能名称的自动完成。然后当用户选择一个名称时,它会将相关ID存储在一个隐藏字段中,并且可以在提交表单时使用,这样您的SQL就可以直接提供一个现成的ID,而不必去寻找它。那么用户选择的内容就没有歧义了。 【参考方案1】:

您可以使用子查询,因为我知道您想按名称更新不在同一个表中的名称,您可以查看下面的查询:

$sql = "UPDATE ativos  SET ativo = ?, comentario = ?, data_aquisicao = ?, localizacao = ?, fabricante = ?, modelo = ?, imei = ?, 
    numero_serie = ?, ativo_sap = ?, anexo_a = ?, evento = ?, data_evento = ?  WHERE id_colaborador in (SELECT id_colaborador FROM colaboradores WHERE nome = ?) and  id_ativo = ?";

@ADyson 在评论中有解决方案,它也按名称更新 id_colaborador:

$sql = "UPDATE ativos SET ativo = ?, comentario = ?, data_aquisicao = ?, localizacao = ?, fabricante = ?, modelo = ?, imei = ?, numero_serie = ?, ativo_sap = ?, anexo_a = ?, evento = ?, data_evento = ?, id_colabarador = (SELECT id_colaborador FROM colaboradores WHERE nome = ? LIMIT 1) WHERE id_ativo = ?";

【讨论】:

@ADyson 谢谢你,是的,我看到了,但我想他已经知道,因为即使选择会返回不止一行,他仍然有 id_ativo 那里,我认为不会有问题,因为 id_ativo 和返回的 id_colaborador 将生成一个唯一键(我认为) 好吧,它不再给我任何错误,但它完全跳过了这个动作,什么也不做(现在也不用 ID):/ @CarlosSantiago 是不是意味着没有更新? @HamzaNig 是的:/ @CarlosSantiago 哦,对不起,不是 mysql,TOP 是 SQL Server 语法。道歉。请改用$sql = "UPDATE ativos SET ativo = ?, comentario = ?, data_aquisicao = ?, localizacao = ?, fabricante = ?, modelo = ?, imei = ?, numero_serie = ?, ativo_sap = ?, anexo_a = ?, evento = ?, data_evento = ?, id_colabarador = (SELECT id_colaborador FROM colaboradores WHERE nome = ? LIMIT 1) WHERE id_ativo = ?";。但是真的,我会停止在这方面浪费你的时间,而是看看一个适当的自动完成功能。老实说,这是一个更加正常和可靠的解决方案。【参考方案2】:

此查询将允许您根据从表单输入的名称更新 ativos 表中的 id_colabarador:

$sql = "UPDATE ativos SET ativo = ?, comentario = ?, data_aquisicao = ?, localizacao = ?, fabricante = ?, modelo = ?, imei = ?, numero_serie = ?, ativo_sap = ?, anexo_a = ?, evento = ?, data_evento = ?, id_colabarador = (SELECT id_colaborador FROM colaboradores WHERE nome = ? LIMIT 1) WHERE id_ativo = ?";

请注意,如果名称在 colabarador 表中不是唯一的,则它可能会意外返回错误的 ID。

正如 cmets 中提到的,我强烈建议您重新设计 GUI,以便用户可以使用名称进行选择,但在后台存储与所选记录相关的 ID,以便 ID可以直接从表单传递给 PHP,然后在 SQL 中用来代替子查询。这将更加可靠,并且不会让您意外误认记录。

【讨论】:

以上是关于具有多个 WHERE 和 SELECT 条件的更新 - MySql的主要内容,如果未能解决你的问题,请参考以下文章

使用具有嵌套或条件的多个 where(或 AND)?

SQL语句中where条件的写法

LIST where或select如何动态查找多个条件

我想学习数据库增删改查

MYSQL IN 或多个条件

SQLAlchemy 更新多个 WHERE 条件