0

EDIT2:解決済み迅速な返信をありがとう、あなたの助けに感謝します。特にジェレミー・スミス氏に作業ソリューションを提供してください。

私はSQLにかなり慣れていないので、更新クエリを作成するための解決策を見つけることができません. 私は次の表を持っています

テーブル:order

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

2 の cid を 1 にしたいのですが、同じ pid (id.2 & id.3) を持つ行を更新しません。私が望む結果は次のとおりです。

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

疑似クエリの例: UPDATE オーダー SET cid=1 WHERE cid=2 AND 1.pid <> 2.pid;

EDIT1: pid 値と cid および id を混同しないように、開始時に「a」で変更しました。提案されているように、順序をテーブル名として使用しません。更新時に、cid の pid を重複させたくないだけです 英語が下手で申し訳ありません。

4

3 に答える 3

2

私はあなたを正しく理解したと思います:

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

どう思いますか?

注意: ORDERは予約語です。詳細をお読みください

于 2013-09-10T16:45:00.647 に答える
0

これは、次の点により、MySQL では複数のステップ (つまり、単一のUPDATEステートメントではない) でのみ実行できます。

ポイント 1 : 他の行と同じでない行のリストを取得するpidには、更新前にクエリを実行する必要があります。例えば:

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

これにより、他の行とa を共有しないID のリストが得られます。ただし、http://dev.mysql.com/doc/refman/5.6/en/subquery-restrictions.htmlのポイント 2pidに対処する必要があります。

通常、サブクエリでテーブルを変更して同じテーブルから選択することはできません。

つまり、UPDATEステートメントでそのようなサブクエリを使用することはできません。ステージング テーブルを使用して、そのセットpidUPDATE基づいて を格納する必要があります。

たとえば、次のコードは、テーブルに複数回出現するbadpidsすべての を含むという一時テーブルを作成します。次に、 を実行しますが、 のリストに がない行に対してのみです。pidordersUPDATEpidbadpids

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 に答える