MYSQL 之傷, 那些我們看不見的坑

2021-07-23 05:47:52 字數 3750 閱讀 3386

說說本地變數在sql語句中的作用。

利用變數如@a,常見的,用作排序,作資料分析計算等。

但是當我們的sql語句足夠複雜,這時我的大腦還沒瘋掉,可是mysql的sql engineer卻**了。

而且更氣人的是,這玩意兒竟然還不報錯。默默地返回乙個錯誤的數值給我。

我們還能不能愉快地玩耍了,作為小小的dba,表示很受傷。

扔個**給你們,自己體會我的痛苦:

select 

content_id, title, media_path, media_duration, media_size, img_addr, channel_id, owner_id,owner_name,

is_virtual_publish, upload_user_id, update_date, status, review_status, review_time, show_order, release_date, modify_time,offline_reason,transcode_status

from (

select

b.content_id,

b.title,

ifnull(b.media_path,'null') media_path,

b.media_duration,

b.media_size,

ifnull(b.title_img, c.img_addr ) img_addr,

a.channel_id,

a.user_id owner_id,

u.nickname owner_name,

case

when a.user_id in (1,2) then

'1'else

'0'end is_virtual_publish,

a.user_id upload_user_id,

a.update_date,

'0'status,

'1' review_status,

b.release_date review_time,

case

when @cn=c.id then @so:=@so+1

else @so:=1

end show_order ,

case

when @cn=c.id then @so:=@so else @cn:= c.id end emo ,

b.release_date,

null modify_time,

null offline_reason,

'0' transcode_status

from jc_content a, jc_content_ext b, ayst_share.album_info c , jc_user u,(select @cn:=0, @so:=1) m

where a.content_id = b.content_id

and a.channel_id = c.id

and a.user_id = u.user_id

and a.status=2

order

by b.release_date,c.id

)v;

我特擅長寫複雜及nb的sql,畢竟我幹了10多年了純dba了。但是我也極其討厭寫複雜的sql。

不是因為我不會寫,而是因為我的理念和追求 。

**應該是簡潔的,清晰明了的。就像架構一樣。 愚蠢的人才會搞得那麼複雜,到最後自己被自己搞亂。

言歸正傳,說上面的這個**,錯誤根本在於mysql在多表關聯時,變數計算的時間不是最後排序以後,而是在排序之前都計算好了,這完全不是我的本意。知道這個原因後,解決起來也簡單,正確姿勢如下:

解決方法:

1, 可以在資料匯入到目標表後再計算:

set @so=0, @cn=0 ;

update audio_file_info a

set a.show_order= case

when

@cn= album_id then

@so:=@so+1

else

@so:=1

end ,

a.album_id= case

when

@cn= album_id then

@cn:=@cn

else

@cn:= album_id end

order

by album_id, release_time desc, a.id

2, 多加一層巢狀,在臨時表(虛擬檢視)上作變數計算:

select 

content_id, title, media_path, media_duration, media_size, img_addr, channel_id, owner_id,owner_name,

is_virtual_publish, upload_user_id, update_date, status, review_status, review_time, release_date, modify_time,offline_reason,transcode_status,

case when @cn=channel_id then @so:=@so+1

else @so:=1

endshow_order ,

case when @cn=channel_id then @cn:=@cn else @cn:= channel_id end

emofrom (

select

b.content_id,

b.title,

ifnull(b.media_path,'null') media_path,

b.media_duration,

b.media_size,

ifnull(b.title_img, c.img_addr ) img_addr,

a.channel_id,

a.user_id owner_id,

u.nickname owner_name,

case when a.user_id in (1,2) then

'1'else

'0'end

is_virtual_publish,

a.user_id upload_user_id,

a.update_date,

'0'status,

'1' review_status,

b.release_date review_time,

b.release_date,

null modify_time,

null offline_reason,

'0' transcode_status

from jc_content a, jc_content_ext b, ayst_share.album_info c , jc_user u

where a.content_id = b.content_id

anda.channel_id = c.id

anda.user_id = u.user_id

anda.status=2

order by c.id ,b.release_date,b.content_id

)v,(select @cn:=0, @so:=1) m

好了,方法我都教給你們了。師傅領進門,修行靠個人。

最後,希望大家都能每天愉快地工作。少些bug,少些煩惱。

「看不見的手」

150年前,隱秘的歐洲金融權貴羅斯切爾德家族保留著一句名言 絕大多數的人民在智力上不足以理解這個系統 支票貨幣和信用貨幣 以及這個系統所衍生出的資本和巨大優勢,他們將承受壓迫而毫無怨言,甚至一點都不會懷疑這個系統損害了他們的利益。多年之後,羅斯切爾德家族的子孫,幾乎控制了所有發達國家的貨幣發行權,掌...

關於假設 看不見的基石

關於假設 看不見的基石 invisible foundation stone 1序我們現在的大多數基礎理論都是建立在一些簡單而明顯的假設之上的。例如在數學領域,在物理學領域,在化學領域 同時也有一些基礎理論因為假設的錯誤或者不夠準確,而被新的理論所代替,或者被擴充套件和修改。例如 第五公設問題 2展...

看不見的競爭 頻寬優化

看不見的競爭 檔案和資料壓縮 看不見的競爭 把握意見領袖 對於有創業經驗的人而言,這甚至都不能稱之為問題。但必須指出,其實很多創業新人,會忽略這個問題。很多人會簡單的認為,我找乙個靠譜的託管方,把我的內容放上去,就可以了,其實,問題真的沒那麼簡單。不說別人,我自己都交過學費。很久以前,電信網通分家的...