(抱歉我的英文不好,我会尽力做到最清楚)
我想在MySQL表中选择一个用户的5个对话(超过一个未确定的数字,可能有5或300个对话),对于每个用户,我想选择所有在其中进行通话的用户。< / p>
在一个美好的世界里,我想用一个查询来做这件事。
我的查询看起来像(表格是法语,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
我想要的是获得五个CONVERSATIONS及其所有数据(无论其中的用户数量等)
我想我将不得不使用两个查询(在获得5个对话之后,我会在每个对话中获得用户),但也许你们可以用你的知识点亮我。
THX。
答案 0 :(得分: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;