1. 程式人生 > >mysql 根據關聯查詢結果 修改 或者 新增 資料

mysql 根據關聯查詢結果 修改 或者 新增 資料

       在工作中遇到了一個這樣的問題,:更新一個表中的資料, 但是這個表的資料 是根據 多個表 才能查到, 即通過 select 查詢出結果後,在通過查詢出的結果 修改 或者新增 資料: 

1 基礎資料:

1.1z_user 使用者表:

  DLL語句

CREATE TABLE `z_user` (
  `user_id` int(23) NOT NULL AUTO_INCREMENT,
  `book_id` int(23) DEFAULT NULL COMMENT '書籍ID',
  `game_id` int(23) DEFAULT NULL COMMENT '遊戲ID',
  `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '姓名',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
表內容:

1.2 z_book 書籍表: 

DLL語句:

CREATE TABLE `z_book` (
  `book_id` int(23) NOT NULL AUTO_INCREMENT COMMENT '書ID',
  `book_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '書名',
  PRIMARY KEY (`book_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

表內容:


1.3 z_game 遊戲表:

DLL語句:

CREATE TABLE `z_game` (
  `game_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '遊戲ID',
  `game_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '遊戲名稱',
  PRIMARY KEY (`game_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
表內容:

1.4 z_test  需要插入或者修改的表:

   DLL語句:

CREATE TABLE `z_test` (
  `user_id` int(23) NOT NULL,
  `user_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `book_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `game_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

2 根據user_id插入語句:

 INSERT INTO  z_test (
 user_id,
 user_name,
 book_name,
 game_name
)
select 
u.user_id,
u.name as user_name,
b.book_name,
g.game_name 
from 
z_user u LEFT JOIN z_book b ON u.book_id = b.book_id 
LEFT JOIN z_game g ON u.game_id = g.game_id 
where  u.user_id = 1

結果如下:


  成功!!

3 根據ID查詢出相關資訊後在修改:

   將 z_user,z_book,z_game 表中 的name屬性名稱加上"11"以作區別:

   update 語句如下:

UPDATE z_test t,z_user u,z_book b,z_game g SET
t.user_name = u.name,
t.book_name = b.book_name,
t.game_name = g.game_name
WHERE 1=1
and t.user_id  =  u.user_id
and b.book_id  =  u.book_id
and g.game_id  =  u.game_id
and u.user_id = 1

結果如下:

修改成功!

     總結:雖然這個是mysql的基礎修改資料,但是還有很多細節需要注意,比如,insert的語句中查詢出的欄位一定要和需要插入的欄位保持一致,不一致的話就使用"as" 用別名使之保持一致,否之無法插入;  在修改的時候,可能會出現 執行成功但是就是沒有變化的情況,這時就要仔細看一下,你的條件是否正確, 我遇到的是: 已知user_id 那麼 z_user表中 該id下的屬性都是知道的, 必須使用 b.book_id = u.book_id 和 g.game_id = u.game_id 才能正確插入的情況, 雖然 用 "="號連線兩邊都會是相同的,自我感覺右邊還得放已知條件才行,我也整的很懵逼,不知為何!