0

EDIT2:已解决感谢大家的快速回复,感谢您的帮助。特别感谢Jeremy Smyth先生的工作解决方案。

我对 sql 还很陌生,找不到进行更新查询的解决方案。我有下表

桌子:order

id | cid | pid 
1  | 1   |  a1 
2  | 1   |  a2
3  | 2   |  a2
4  | 2   |  a3
5  | 2   |  a4

我希望 2 的 cid 变为 1,但不更新具有相同 pid ie(id.2 & id.3) 的行。我想要的结果是:

id | cid | pid
1  | 1   |  a1
2  | 1   |  a2
3  | 2   |  a2
4  | '1' |  a3
5  | '1' |  a4

伪查询示例:UPDATE order SET cid=1 WHERE cid=2 AND 1.pid <> 2.pid;

EDIT1:不要将pid值与cid和id混淆,我在开始时用'a'更改了它们。正如建议的那样,我不会使用 order 作为表名。在更新时,我只是不想为 cid 重复 pid 抱歉英语不好。

4

3 回答 3

2

我希望我对你的理解是正确的:

UPDATE `order`
   SET cid = 1 
 WHERE cid = 2 
   AND cid <> pid

你怎么看?

请注意ORDER是保留字,阅读更多

于 2013-09-10T16:45:00.647 回答
1

我想你需要这样的东西。

UPDATE order SET cid=1 WHERE cid=2 AND cid <> pid;
于 2013-09-10T16:47:09.690 回答
0

这只能UPDATE在 MySQL 中分多个步骤(即不是单个语句)来完成,因为以下几点

第 1 点:要获取与pid其他行不同的行列表,您需要在更新之前进行查询。例如:

SELECT id FROM `order` 
WHERE pid NOT IN (
   SELECT pid FROM `order`
   GROUP BY pid
   HAVING COUNT(*) > 1
)

这将为您提供不pid与其他行共享的 ID 列表。但是,我们必须处理来自http://dev.mysql.com/doc/refman/5.6/en/subquery-restrictions.html的第 2 点

通常,您不能在子查询中修改表并从同一个表中进行选择。

这意味着您不能在UPDATE语句中使用这样的子查询。您将不得不使用临时表来存储pids 并UPDATE基于该集合。

例如,以下代码创建一个名为的临时表badpids,其中包含pid在表中多次出现的所有 s orders。然后,我们执行, 但仅针对列表中UPDATE没有 a 的行:pidbadpids

CREATE TEMPORARY TABLE badpids (pid int);

INSERT INTO badpids
   SELECT pid FROM `order`
   GROUP BY pid
   HAVING COUNT(*) > 1;

UPDATE `order` SET cid = 1
WHERE cid= 2 
AND pid NOT IN (SELECT pid FROM badpids);
于 2013-09-10T16:44:02.240 回答