C# 无法更新所需的行
我有以下查询,它通过C以单个字符串执行C# 无法更新所需的行,c#,mysql,sql,.net,database,C#,Mysql,Sql,.net,Database,我有以下查询,它通过C以单个字符串执行 SET @out_param := ''; SELECT sightinguid FROM pc INNER JOIN c ON uid = id WHERE //... other conditions AND (@out_param:=CONCAT_WS(',', sightinguid, @out_param
SET @out_param := '';
SELECT
sightinguid
FROM
pc
INNER JOIN
c ON uid = id
WHERE
//... other conditions
AND (@out_param:=CONCAT_WS(',', sightinguid, @out_param))
LIMIT 50 FOR UPDATE;
UPDATE pc
SET
last_accessed_timestamp = NOW()
WHERE
sightinguid IN (@out_param);
SELECT @out_param;
我基本上是尝试将第一个查询的前50个值放在一个逗号分隔的字符串中,并在最后返回这个字符串。在此之前,我希望update语句在这些记录上执行。但是,只更新了第一次看到的UID。当我在@out_param部分中硬编码多个sightinguid值时,它会工作并更新所有值-因此我假设该部分有问题
由于限制50部分,我不能将SELECT放入子查询并从那里更新,因为MySQL不允许在子查询中设置限制
有什么想法吗?正如你所说,我不知道你是否能像那样使用IN,即使用变量。 无论如何,一个简单的解决方法是使用临时表在两个查询之间存储信息:
CREATE TEMPORARY TABLE temp(
sightinguid #typeofsightinguid
)
INSERT INTO temp
SELECT //select1
sightinguid
FROM
pc
INNER JOIN
c ON uid = id
WHERE
//... other conditions
AND (@out_param:=CONCAT_WS(',', sightinguid, @out_param))
LIMIT 50 FOR UPDATE;
UPDATE pc
SET
last_accessed_timestamp = NOW()
WHERE
sightinguid IN (SELECT sightinguid FROM temp);
DROP TABLE temp;
SELECT @out_param;
如果临时表不是一个选项,不管是什么原因,那么您必须执行类似于建议的操作:基本上,限制子查询的子查询。比如:
UPDATE pc
SET
last_accessed_timestamp = NOW()
WHERE
sightinguid IN (
SELECT sightinguid FROM (
SELECT //select2
sightinguid
FROM pc
INNER JOIN c
ON uid = id
WHERE //... other conditions
LIMIT 50
) tmp
)
另外,还有一件我之前忘记提到的事情:使用LIMIT with ORDER BY可能会导致非确定性查询,即使用不同的行顺序。因此,按照我编写的示例,您可以在select1和select2上获得两个不同的结果集。运行一个探查器,找出查询是如何执行的,这里的问题似乎是来自C客户机的参数绑定,在某些地方它没有获得正确的值或值被覆盖,否则如果硬编码有效,然后,查询并没有多大问题,因为suchTemp表不是一个选项。不幸的是,银行刚刚尝试过它,它似乎可以工作。有什么办法可以优化它吗?时间太长了,这个问题太宽泛了。有许多不同的方法可以优化查询性能,其中许多甚至与查询语法无关。这让你有理由发布另一个问题,更详细、更具体。