天天看點

mysql limit in_Mysql子查詢IN中使用LIMIT

學習下Mysql子查詢IN中使用LIMIT的方法。

這兩天項目裡出了一個問題,mysql LIMIT使用後報錯。

需求是這樣的,我有3張表,infor資訊表,mconfig物料配置表,maaply物料申請表,要求是讀出申請表中哪些人申請哪些物料

于是,首先這樣寫:

SELECT infor.name,infor.phone,infor.add,

mconfig.mname,mapply.acount,from_unixtime(mapply.atime,'%Y-%m-%d') as 'atime'

FROM mapply right JOIN infor ON mapply.uid = infor.uid inner JOIN mconfig ON mapply.mid = mconfig.mid

WHERE mapply.aid

IN (

SELECT aid

FROM `mapply` where state = $state

ORDER BY `atime` , `uid` DESC

LIMIT 0,10

) www.jbxue.com

結果報錯了

當時沒注意報的什麼錯誤,隻是看到LIMIT什麼的錯誤,于是修改以下代碼:

SELECT infor.name,infor.phone,infor.add,

mconfig.mname,mapply.acount,from_unixtime(mapply.atime,'%Y-%m-%d') as 'atime'

FROM mapply right JOIN infor ON mapply.uid = infor.uid inner JOIN mconfig ON mapply.mid = mconfig.mid

WHERE mapply.aid

IN (

SELECT aid

FROM `mapply` where state = $state

ORDER BY `atime` , `uid` DESC

)

LIMIT 0,10
           

這樣沒有報錯,莫離以為OK了,但是運作後發現,資料有問題

和單純的讀出申請表的内容不一樣,才發現LIMIT的位置放錯了,于是又把LIMIT發在IN裡,結果報錯如下

This version of MySQL doesn't yet support ‘LIMIT & IN/ALL/ANY/SOME subquery'

細看才知道,IN裡不支援LIMIT。那怎麼辦呢?www.jbxue.com

于是度娘後得知,在IN裡再使用一張臨時表,把需要的内容先查出來,

修改後:

SELECT infor.name,infor.phone,infor.add,

mconfig.mname,mapply.acount,from_unixtime(mapply.atime,'%Y-%m-%d') as 'atime'

FROM mapply right JOIN infor ON mapply.uid = infor.uid inner JOIN mconfig ON mapply.mid = mconfig.mid

WHERE mapply.aid

IN (

SELECT aid

FROM (SELECT `aid` FROM `mapply` where state = $state

ORDER BY `atime` , `uid` DESC

LIMIT 0,10)AS `tp`

)

運作後,問題解決!