最近遇到一個測試數據的需求,需要往一個表中插入4個來源的數據。
往orders 表中插入 來自
- sql_person
- cm_user_car_model
- cm_sp_product_new
- 部分固定數據以及兩個遞增的時間數據
對於4的數據很好處理不過是時間處理,以及固定值的遞增。
對於1,2,3部分,第一眼想到的是用cross join來去三個表的笛卡爾積,三個表各取一條拼合在一起插入
例如select a.*,b.*,c.* from (select * from t1 where... limit 1 ) a
join (select * from t2 where... limit 1 )b
Join (select * from t3 where... limit 1 )c
由於沒有明確的對應條件,也就沒有辦法將結果集一一對應,一次性插入(仔細想想應該也可以,不過我將4部分的數據放在a中一起插入,由於遞增的需求我只能一天一天的插入)
但是發現 由於 b,c的結果集可能為 null 導致插入數據的時候發生錯誤,而limit 1 也無法實現在 select * from t2 where...的結果集中隨機取一條的目的。。
我改變了一次性插入的策略,選擇先插入一條數據,然后通過
LAST_INSERT_ID()(由於是測試庫,只有我一個人再用)等方法獲取剛插入的數據自增id,通過自增id來update剛剛插入的數據行。
這樣就解決了插入條數的問題,不會因為某個子查詢為空而使得三個表的join結果也為空了。
但是子查詢結果集中隨機取一條並沒有實現。Limit 1沒有解決我的需求,每一次取出來的都是同一條數據,由於mysql 表沒有提供rownum,所以實現起來沒有oracle那么水到渠成。網絡上提供了一種在查詢之中加入一個自實現的’rownum’值,再在查詢外嵌套一層的查詢來將隨機的rownum值取得。
這里可以在查詢中加入一個新的隨機數字段 ra,通過order by ra 來獲取一個隨機字段。
SELECT
RAND() as ra,
repay_month,
model_id,
car_price
FROM
cm_user_car_model
order by ra
limit 1
這樣顯的更加簡潔。