Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用多个表从SQL获取X结果_Mysql_Sql - Fatal编程技术网

Mysql 使用多个表从SQL获取X结果

Mysql 使用多个表从SQL获取X结果,mysql,sql,Mysql,Sql,(对不起,我的英语不好,我会尽量说清楚的) 我想在一个MySQL表中选择一个用户的5个对话(在一个不确定的数字上,可能有5个或300个对话),对于其中的每一个,我想选择在其中交谈的所有用户 在一个奇妙的世界里,我想用一个查询来完成它 我的查询看起来像(表是法语的,请不要伤害我): 其中,msg_individus是对话参与者的表格, msg_conversations是会话表(id、主题、状态), u_individus是包含用户信息的表格 为了只选择其中的5个对话,我添加了如下内容 GROUP

(对不起,我的英语不好,我会尽量说清楚的)

我想在一个MySQL表中选择一个用户的5个对话(在一个不确定的数字上,可能有5个或300个对话),对于其中的每一个,我想选择在其中交谈的所有用户

在一个奇妙的世界里,我想用一个查询来完成它

我的查询看起来像(表是法语的,请不要伤害我):

其中,
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;