2017-02-28 147 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