2017-02-28 99 views
1

(對不起我的英文不好,我會盡量最清晰)獲取X結果與多個表

我想選擇5個對話(在一個不確定的數字,可能有5個或300對話)的一個用戶在MySQL表中,並且對於其中的每個用戶,我想選擇所有在其中通話的用戶。

在一個奇妙的世界中,我想用一個查詢來完成它。

我的查詢看起來像(表是在法國,PLZ不要傷害我):

SELECT mc.mc_id, mc.mc_sujet, mc.mc_statut, 
    miu.mi_ustatut as uself_statut, miu.mi_datelecture as uself_datelecture, 
    mi.mi_uid, mi.mi_ustatut, mi.mi_datelecture, 
    u.u_pseudonyme 
FROM msg_individus as miu 
    LEFT JOIN msg_conversations as mc ON mc.mc_id = miu.mi_mcid 
    LEFT JOIN msg_individus as mi ON mi.mi_mcid = mc.mc_id 
    LEFT JOIN u_individus as u ON u.u_id = mi.mi_uid 
WHERE miu.mi_uid = :u_id 

哪裏msg_individus是表與會話的參與者, msg_conversations是會話(ID的表,主題,狀態), u_individus是包含用戶信息的表格。

只選擇5這些談話中,我又補上一句

GROUP BY mc.mc_id, 
LIMIT 0,5 

但當然,每個會話只能有一個用戶給出的這個樣子。

我也試着寫GROUP BY mc.mc_id, mi.mi_uid但這吧,像沒有書面方式在GROUP BY條件,返回5次迭代,如:

(Conversation 1 has two users, conversation 2 has one, conversation 3 has four) 
Iteration 1 : conversation 1, user 1 
Iteration 2 : conversation 1, user 2 
Iteration 3 : conversation 2, user 1 
Iteration 4 : conversation 3, user 1 
Iteration 5 : conversation 3, user 2 

我想要的是得到5個交談的所有提交的數據(無論什麼數用戶等)

我想我將不得不使用兩個查詢(獲得5個對話後,我會得到每個對話的用戶),但也許你們可以用你的知識點亮我。

Thx。

回答

2

使用子查詢獲得五個對話。我還建議你用內連接替換外連接。我認爲桌子上的鑰匙應該都是匹配的:

SELECT mc.mc_id, mc.mc_sujet, mc.mc_statut, 
     miu.mi_ustatut as uself_statut, miu.mi_datelecture as uself_datelecture, 
     mi.mi_uid, mi.mi_ustatut, mi.mi_datelecture, 
     u.u_pseudonyme 
FROM (SELECT miu.*, mc.* 
     FROM msg_individus miu JOIN 
      msg_conversations mc 
      ON mc.mc_id = miu.mi_mcid 
     WHERE miu.mi_uid = :u_id 
     ORDER BY rand() -- not necessary, but why not? 
     LIMIT 5 
    ) ic 
    msg_individus mi 
    ON mi.mi_mcid = ic.mc_id JOIN 
    u_individus u 
    ON u.u_id = ic.mi_uid; 
+0

它似乎按預期工作!對於我的信息(因爲我是一個noob),爲什麼內連接比外連接好?無論如何,這就是Thx! – Vae

+0

@Vae。 。 。有兩個原因。首先是你應該使用最符合你意圖的「加入」。第二個是內部聯接爲優化器提供了更多優化性能的機會。 –

+0

Thx很多爲您的信息。非常好。 – Vae