mysql - mybatis select語句問題
过去多啦不再A梦
过去多啦不再A梦 2017-06-20 10:05:48
0
3
1063

訊息提醒續,這個訊息可能是別人直接回覆了你的文章,這時需要進行資料庫操作關聯文章表獲取相應文章的內容【訊息提醒:您的文章xxx有了新的回應】,也可能是別人回覆了你的評論這時關聯的就是評論表來獲取評論的內容【訊息提醒:您的評論xxx有了新的回應】,訊息點擊後即可出現顯示詳情這樣子。

資料庫表結構如下

#mbelongbid為訊息所屬的文章的id,mbelongcid為訊息所屬的評論的id。
當mbelongcid為空時說明訊息是直接回覆文章,此時關聯的是文章表;
當mbelongcid不為空時說明訊息回覆的物件是某則評論,此時關聯的是評論表。

sql語句要怎麼寫才能符合這種需求?
現在的想法是:

select

r.*, 
<if test="mbelongcid == null">`blog`.btitle</if>
<if test="mbelongcid != null">`comment`.ccontent</if>

from
(

select 
    mid, mreferuid, mbelongbid, mbelongcid
from 
    message
where mid = #{_parameter}

)r,
<if test="mbelongcid == null">

`blog` where r.mbelongbid = `blog`.bid

</if>
<if test="mbelongcid != null">

`comment` where r.mbelongcid = `comment`.cid

</if>

直接這樣寫是有問題的,大致的想法就是根據mbelongcid是否為null去關聯不同的表獲取不同的字段,有沒有好的解決方案或者建議?

过去多啦不再A梦
过去多啦不再A梦

全部回覆(3)
给我你的怀抱
  1. mbelongcid不是你傳入的參數的一部分,所以mybatis並不知道它到底是不是null! ,你要實現你想要的這種邏輯應該從資料庫端去著手,例如建立一個視圖,這個視圖由兩個查詢union而成。

select mid, mreferuid, 'blog' as type, mbelongbid as rid
from message m, blog b
where mbelongcid  is null and mbelongbid is not null and mbelongbid = b.bid
union
select mid, mreferuid, 'comment' as type, mbelongcid as rid
from message m, comment c
where mbelongcid is not null and mbelongcid = c.cid
  1. 當你寫程式遇到這種需要很奇怪的語法的時候,請先回顧一下設計方案,通常緣由都是設計就有問題。

  2. 資料表誰設計的?扣工資 至少要加個底線啊m_belong_cid,學生黨,慢慢來吧。

过去多啦不再A梦

我們專案用的是​​註解式SQL,遇到這類情況都是直接在Provider拼SQL解決。

扔个三星炸死你

MessageMapper.xml這部分的語句如下:

message類別如下:

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板