Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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
C# 无法更新所需的行_C#_Mysql_Sql_.net_Database - Fatal编程技术网

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

我有以下查询,它通过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))
    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表不是一个选项。不幸的是,银行刚刚尝试过它,它似乎可以工作。有什么办法可以优化它吗?时间太长了,这个问题太宽泛了。有许多不同的方法可以优化查询性能,其中许多甚至与查询语法无关。这让你有理由发布另一个问题,更详细、更具体。