Mysql 多表數據拼接插入及子查詢結果集隨機取一條


最近遇到一個測試數據的需求,需要往一個表中插入4個來源的數據。

 

orders 表中插入 來自

  1. sql_person
  2. cm_user_car_model
  3. cm_sp_product_new
  4. 部分固定數據以及兩個遞增的時間數據

對於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中一起插入,由於遞增的需求我只能一天一天的插入)

但是發現 由於 bc的結果集可能為 null 導致插入數據的時候發生錯誤,而limit 1 也無法實現在 select * from t2 where...的結果集中隨機取一條的目的。。

 

我改變了一次性插入的策略,選擇先插入一條數據,然后通過

LAST_INSERT_ID()(由於是測試庫,只有我一個人再用)等方法獲取剛插入的數據自增id,通過自增idupdate剛剛插入的數據行。

 

這樣就解決了插入條數的問題,不會因為某個子查詢為空而使得三個表的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

這樣顯的更加簡潔。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM