Php 在一个状态中从选择数组更新查询

Php 在一个状态中从选择数组更新查询,php,mysql,sql,Php,Mysql,Sql,嗨,我有两条SQL语句 报表1: SELECT id, name, version FROM mydb WHERE device IS NULL AND Activated=1 ORDER BY id ASC LIMIT 10 报表2: UPDATE mydb SET device='$device' WHERE name IN ('$itemsArray') 我已经从第一条语句中得到了$itemsArray数组,但是现在我需要组合这些语句,我不知道如何继续并保持它的效率 当我自己尝试时,有

嗨,我有两条SQL语句

报表1:

SELECT id, name, version FROM mydb WHERE device IS NULL AND Activated=1 ORDER BY id ASC LIMIT 10
报表2:

UPDATE mydb SET device='$device' WHERE name IN ('$itemsArray')
我已经从第一条语句中得到了
$itemsArray
数组,但是现在我需要组合这些语句,我不知道如何继续并保持它的效率

当我自己尝试时,有0行受到影响:

UPDATE mydb SET device='$device' WHERE Name IN (SELECT name FROM mydb WHERE device IS NULL AND Activated=1 ORDER BY id ASC LIMIT 10)
编辑:从子查询中删除引号。现在我得到了这个错误:“这个版本的MySQL还不支持‘LIMIT&IN/ALL/ANY/SOME子查询’”


使用MySQL版本:5.7.15

这是正确的语法,看起来更像这样:

UPDATE mydb
    SET device = '$device'
    WHERE Name IN (SELECT name FROM mydb WHERE device IS NULL AND Activated=1 ORDER BY id ASC LIMIT 10);
子查询不应该像字符串一样用引号括起来

然而,我不认为这会有两个原因:(1)表是相同的,(2)限制

因此,这可能会满足您的要求:

UPDATE mydb
    SET device = '$device'
    WHERE device IS NULL AND Activated = 1
    ORDER BY id ASC
    LIMIT 10;

如果您真的想基于
name
而不是
id

进行更新,您可能需要一个更复杂的查询。5.7版的MySQL文档中声明“MySQL不支持对某些子查询运算符的子查询限制”

我还在subqueries错误中发现了这篇相关文章,其中包含LIMIT关键字:


希望这有帮助:)

使用
JOIN
将子查询与表关联起来

UPDATE mydb AS t1
JOIN (SELECT name 
      FROM mydb 
      WHERE device IS NULL AND Activated=1 
      ORDER BY id ASC 
      LIMIT 10) AS t2 ON t1.Name = t2.Name
SET device = '$device'

我认为你工作太努力了。摆脱
选择

UPDATE mydb SET device='$device'
    WHERE device IS NULL AND Activated=1
    ORDER BY id ASC LIMIT 10;

您需要去掉子查询中的引号-它当前是一个字符串而不是一个查询。@PhillipXT更新了Question由于您标记为php,您很可能试图运行多查询,而您的方法/服务器/api不支持它。这里没有足够的php或用于连接/查询btw的api。或者
$itemsArray
$device
是什么及其值。您不需要选择(真的很困惑为什么没有人提到这一点-我想您可能需要重新考虑限制)。你只需要加入/全部/一些/任何都是转移注意力的。关注
更新
。谢谢你的回答,但是我得到了这样的错误:“这个版本的MySQL还不支持'LIMIT&IN/ALL/ANY/SOME子查询'”,就像你说的那样,当执行1时,但是对于数字2,它不会更新所有10个项目。第二个查询只更新前10行,并非所有行的名称都与前10行相同。性能将受益于
索引(设备,激活,id)
。这两个链接都提到在子查询中使用Limit,第二个链接提到了使用连接解决类似问题的方法,这在这里是一个解决方案,因此我希望它能被证明是相关的。与更新相比,我更关注子查询方面,以及MySql版本5.7中使用Limit关键字导致错误。希望它能有所帮助:)@RickJames Barmar将其作为副本关闭,然后您重新打开。伊姆霍,如果你对理查德的回答有疑问,可以向巴尔马提出。另外,他在愚弄的结尾处贴出了答案。我希望你不要生气,因为你的回答没有得到赞成票/接受票。@RickJames,问题的类型无关紧要。任何试图在(子查询)
中使用
WHERE列的查询都不能在子查询中使用
LIMIT
。对于任何类型的查询,解决方案都是一样的:将
WHERE-IN
转换为
JOIN
。事实上,几乎所有
WHERE-column-IN(子查询)
的用法都以
JOIN
的形式编写,效果会更好,因为MySQL有时对
WHERE-IN
的优化效果很差。@RickJames他不想更新10行。他希望从10行中获取名称,并用这些名称更新所有行。为此,他需要一个带有
LIMIT
的子查询,然后需要知道如何使用它来查找所有相关行。链接的问题解释了如何组合它们。有没有一种方法可以从该语句中返回这些选定的名称,而无需执行另一个select语句?没有,没有方法同时执行更新和选择。请注意,我可能会添加此答案下的注释,用于与(您)结束问题,但后来瑞克·詹姆斯重新开放了。我很乐意提出这个问题,可能会闭嘴。