Mysql 使用多个表从SQL获取X结果
(对不起,我的英语不好,我会尽量说清楚的) 我想在一个MySQL表中选择一个用户的5个对话(在一个不确定的数字上,可能有5个或300个对话),对于其中的每一个,我想选择在其中交谈的所有用户 在一个奇妙的世界里,我想用一个查询来完成它 我的查询看起来像(表是法语的,请不要伤害我): 其中,Mysql 使用多个表从SQL获取X结果,mysql,sql,Mysql,Sql,(对不起,我的英语不好,我会尽量说清楚的) 我想在一个MySQL表中选择一个用户的5个对话(在一个不确定的数字上,可能有5个或300个对话),对于其中的每一个,我想选择在其中交谈的所有用户 在一个奇妙的世界里,我想用一个查询来完成它 我的查询看起来像(表是法语的,请不要伤害我): 其中,msg_individus是对话参与者的表格, msg_conversations是会话表(id、主题、状态), u_individus是包含用户信息的表格 为了只选择其中的5个对话,我添加了如下内容 GROUP
msg_individus
是对话参与者的表格,
msg_conversations
是会话表(id、主题、状态),
u_individus
是包含用户信息的表格
为了只选择其中的5个对话,我添加了如下内容
GROUP BY mc.mc_id,
LIMIT 0,5
但当然,这种方式每次对话只提供一个用户
我还尝试按mc.mc\u id,mi.mi\u uid写入分组,但这与不按条件写入分组一样,会返回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个对话后,我将获得每个对话的用户数),但也许你们可以用你们的知识告诉我
Thx.使用子查询获取五个对话。我还建议您将外部联接替换为内部联接。我认为表键应该都有匹配项:
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;
它似乎像预期的那样工作!根据我的信息(因为我是一个noob),为什么内部连接比外部连接更好?反正是Thx@Vae。原因有二。首先,您应该使用与您的意图最匹配的join
。第二,内部联接为优化器提供了更多优化性能的机会。
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;