2013-05-19 101 views
1

我有兩個表:與子條件加入表

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' 

我的第一個目標是找到T1的所有記錄,並非T2使用:

查詢結果:

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

而我的第二個目標是將列設置爲'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語法錯誤;檢查手冊中 對應於你的MySQL服務器版本正確的語法使用 接近「INT),其中tblpeserta.id爲空

是有我的問題的一個更好的查詢?

+0

它不應該是'CAST(SUBSTRING(t2.num 8,5)AS UNSIGNED)'?其實,我不明白爲什麼你需要投在這裏。 – raina77ow

+0

因爲在T1號是在T2中的INT ZEROFILL和數量爲varchar,所以我需要將其轉換爲int所以t1.number和t2.number可以比較 –

回答

0

嘗試

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

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 | 

SQLFiddle

+0

Owsome ..它工作..感謝.. –

+0

@SolaimanMansyur你太客氣了。很高興幫助:) – peterm