2

私は2つのテーブルを持っています:

create table t1(
id int unsigned not null auto_increment,
group varchar(3) not null,
number int unsigned zerofill,
used enum('YES','NO') default );

id   group   number  used
1    '110'   00001   'YES'
2    '110'   00002   'YES'
3    '110'   00003   'YES'
4    '210'   00001   'YES'
5    '210'   00002   'YES'
6    '210'   00003   'YES'
7    '310'   00001   'YES'

create table t2(
id int unsigned not null auto_increment,
number varchar(13) default null);

id   number  
1    '110-00001'
2    '110-00002'
3    '210-00002'
4    '310-00001'

私の最初の目標は、t2 で使用されていない t1 のすべてのレコードを見つけることです。

クエリ結果:

id   group   number  used
3    '110'   00003   'YES'
4    '210'   00001   'YES'
6    '210'   00003   'YES'

そして、私の2番目の目標は、以前は「NO」だった列を設定することです:

id   group   number  used
3    '110'   00003   'NO'
4    '210'   00001   'NO'
6    '210'   00003   'NO'

私はこのようなクエリを使用しようとしました:

  select * from t1 
left outer join t2 
             on t1.number = cast(substring(t2.number,8,5) as int) 
          where t2.id is null;

しかし、mySQL は次のように述べています。

SQL 構文にエラーがあります。tblpeserta.id が null の場合、near 'int) を使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

私の問題に対するより良いクエリはありますか?!

4

1 に答える 1

1

試す

UPDATE t1 LEFT JOIN t2
    ON t1.`group` = LEFT(t2.number, 3)
   AND t1.number = 0 + RIGHT(t2.number, 5)
   SET t1.used = 'NO'
 WHERE t2.id IS NULL

と選択

SELECT *
  FROM t1 LEFT JOIN t2
    ON t1.`group` = LEFT(t2.number, 3)
   AND t1.number = 0 + RIGHT(t2.number, 5)
 WHERE t2.id IS NULL

出力:

| ID | GROUP | NUMBER | USED |
------------------------------
|  3 |   110 |      3 |   NO |
|  4 |   210 |      1 |   NO |
|  6 |   210 |      3 |   NO |

SQLフィドル

于 2013-05-19T05:19:03.660 に答える