0

ある値から別の値を選択することにより、以前の関係のない 2 つのテーブルをリンクしたいと考えています。

だから私のテーブルは次のとおりです。

コード:

ID ラベル
1 1
2 1
3 1
4 2
5 2

人々:

ID タイプ code_id
1 2 バツ
2 2 バツ
3 7 バツ

peopleテーブルから値を選んでテーブルを更新したいcodes。からのアイテムpeopleに条件がある場合は常に、からlabel=2別の ID を選択する必要がありますcodes。「コード」には「人」にいる人よりも多くのコードがあるため、すべての人が異なるコードを持つことができます。

たとえば、結果は次のようになります。

ID タイプ code_id 説明
1 2 4 コード テーブルの 1 つの値で更新
2 2 5 コード表の別の値で更新
3 7 バツ 以来、更新されていませんtype<>2

WHEREこのように INNER JOIN を使用してみましたが、フィルターを使用すると機能しません。

UPDATE people A
INNER JOIN
  (SELECT id FROM codes WHERE label=2) B
USING (id)
SET A.code_id=B.id
WHERE A.type=2;

私は何を間違っていますか?

次のデータでテストするSQL Fiddleを用意しました。

CREATE TABLE codes (id int auto_increment primary key, label int);
CREATE TABLE people (id int auto_increment primary key, type int, code_id int);
INSERT INTO codes VALUES (1,1),(2,1),(3,1),(4,2),(5,2);
INSERT INTO people (id,type) VALUES (1,2),(2,2),(3,7);
4

2 に答える 2

1

このようなこともできます...

 SELECT x.id,x.type, y.id code_id
   FROM 
      ( SELECT a.*
             , COUNT(*) rank
          FROM people a
          JOIN people b
            ON b.type = a.type
           AND b.id <= a.id
         GROUP  
            BY type, id
      ) x
   JOIN 
      ( SELECT a.*
             , COUNT(*) rank
          FROM codes a
          JOIN codes b
            ON b.label = a.label
           AND b.id <= a.id
         GROUP  
            BY label
             , id
      ) y
     ON y.label = x.type 
    AND y.rank = x.rank; 

...またはUPDATEとして書き直されました...

 UPDATE people p
   JOIN
      ( SELECT a.*
             , COUNT(*) rank
          FROM people a
          JOIN people b
            ON b.type = a.type
           AND b.id <= a.id
         GROUP  
            BY type, id
      ) x
     ON x.id = p.id
   JOIN 
      ( SELECT a.*
             , COUNT(*) rank
          FROM codes a
          JOIN codes b
            ON b.label = a.label
           AND b.id <= a.id
         GROUP  
            BY label
             , id
      ) y
     ON y.label = x.type 
    AND y.rank = x.rank
    SET p.code_id = y.id;
于 2013-10-04T12:58:09.187 に答える