Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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 使用左联接和联接上的条件进行更有效的选择查询_Mysql_Sql_Join - Fatal编程技术网

Mysql 使用左联接和联接上的条件进行更有效的选择查询

Mysql 使用左联接和联接上的条件进行更有效的选择查询,mysql,sql,join,Mysql,Sql,Join,这个问题正在讨论中。我得到的答案解决了我的问题,通过限制返回的行,我可以看到它做了我想要的 但现在,当我试图毫无限制地运行整个查询,以便导出到excel进行分析时,我似乎无法实现任何目标。在MySQL工作台中,SQL再次向我询问密码,查询停止运行。我不确定这条信息是否是其他事情,是否是我真正的问题的转移,我的问题是“我如何才能让这个查询运行得更快,如果有的话?”目前它至少运行了5分钟,然后“启动我” 当我解释查询时,这里提供的是: 1 SIMPLE co ALL

这个问题正在讨论中。我得到的答案解决了我的问题,通过限制返回的行,我可以看到它做了我想要的

但现在,当我试图毫无限制地运行整个查询,以便导出到excel进行分析时,我似乎无法实现任何目标。在MySQL工作台中,SQL再次向我询问密码,查询停止运行。我不确定这条信息是否是其他事情,是否是我真正的问题的转移,我的问题是“我如何才能让这个查询运行得更快,如果有的话?”目前它至少运行了5分钟,然后“启动我”

当我解释查询时,这里提供的是:

1   SIMPLE  co  ALL                 185610  Using temporary; Using filesort
1   SIMPLE  my  ref PRIMARY PRIMARY 4   bm_emails.co.id 23  
1   SIMPLE  nvk eq_ref  PRIMARY PRIMARY 4   bm_emails.co.id 1   
可能是临时表导致了“使用临时表”是一个问题,但我不确定如何在维护查询时绕过它。 实际查询如下:

SELECT 
    co.email,
    nvk.nvk_medium,
    CAST(MIN(co.created) AS DATE) AS first_contact,
    MIN(CASE WHEN my.my_id = 581 THEN my.data END) AS WA_Created,
    MIN(CASE WHEN my.my_id = 3347 THEN my.data END) AS WA_Upgraded
FROM bm_emails.cid208 co
LEFT JOIN bm_emails.my208 my ON co.id = my.eid AND (my_id = 581 OR my_id = 3347)
LEFT JOIN bm_emails.nvk208 nvk ON nvk.eid = co.id
GROUP BY email

如果我假设
bm_emails
每封邮件包含一行,那么这可能会更快:

select co.email,
       (select nvk.nvk_medium from bm_emails.nvk208 nvk where nvk.eid = co.id limit 1) as nvk_medium,
       co.created,
       (select min(my.data) from bm_emails.my208 my where co.id = my.eid and my.mid = 581) as WA_Created,
       (select min(my.data) from bm_emails.my208 my where co.id = my.eid and my.mid = 3347) as WA_Updated
from bm_emails.cid208 co;
这可以利用以下索引:

bm_emails.nvk208(eid, nvk_medium)
bm_emails.my208(eid, mid, data)
当然,这取决于第一个假设,即第一个表每封电子邮件有一行

编辑:

即使有多封电子邮件,我还是会尝试:

select cn.mail, cn.nvk_medium, cn.created,
       (select min(my.data) from bm_emails.my208 my where co.id = my.eid and my.mid = 581) as WA_Created,
       (select min(my.data) from bm_emails.my208 my where co.id = my.eid and my.mid = 3347) as WA_Updated
from (select co.email, nvk.nvk_medium, min(co.created) as created
      from bm_emails.cid208 co left join
           bm_emails.nvk208 nvk 
           on nvk.eid = co.id 
      group by co.email, nvk.nvk_medium
     ) cn;

Union all通常比在联接条件下使用OR更快。检查数据结果,我认为使用UNON进行内部连接可能更有意义,但必须查看数据。我还想知道更多关于您希望看到bm_emails.cid208中哪些记录不会加入my_id 581或myid 3347的记录的信息

试试这个:

SELECT email,nvk_medium, CAST(MIN(created) AS DATE) AS first_contact,WA_Created,WA_Upgraded
FROM 
(
    SELECT 
        co.email,
        nvk.nvk_medium,
        co.created AS first_contact,
       my.data AS WA_Created,
       NULL AS WA_Upgraded
    FROM bm_emails.cid208 co
    LEFT JOIN bm_emails.my208 my ON co.id = my.eid AND my_id = 581 
    LEFT JOIN bm_emails.nvk208 nvk ON nvk.eid = co.id
    UNION ALL
    SELECT 
        co.email,
        nvk.nvk_medium,
        co.created AS first_contact,
       NULL AS WA_Created,
       my.data AS WA_Upgraded
    FROM bm_emails.cid208 co
    LEFT JOIN bm_emails.my208 my ON co.id = my.eid AND my_id = 3347
    LEFT JOIN bm_emails.nvk208 nvk ON nvk.eid = co.id
) a
GROUP BY email,nvk_medium,WA_Created,WA_Upgraded

我也会考虑,根据创建字段的数据类型,CAST(Min(创建))是否应该是Min(CAST(创建日期))。如果是某种类型的基于字符串的字段,则2014年10月20日将少于2013年2月24日,并将被选中。如果它存储在datetime类型的字段中,而您只是简单地缩短了时间,那么这就可以了

Myworkbench在一个好的日子里是脆弱的…您的SQL在这里看起来非常干净,除了group by子句(nvk.nvk_medium不是聚合或group by子句中…任何其他数据库都会返回一个错误),但我看不出这会影响性能。这张桌子有多大?从邮件的分组情况来看,我不认为每封邮件有一行。mysql中的一系列子选择可以运行得更快,这一点并不奇怪,我想这只是更有效地使用索引而已。@sexth是正确的,其中有多个电子邮件实例table@Twelfth . . . 绝对地相关子查询可以防止对整个表进行聚合所需的非常大的外部文件排序。另外,他们可以利用索引。谢谢,我试过运行索引,但同样的事情发生了——它运行了一段时间,然后在完成之前就把我踢了出去。值得注意的是,@sefth关于按和nvk_媒体字段分组的评论。查询运行时不会将nvk_介质添加到group by(坏SQL?)。但如果我添加它,它不会运行(或在合理的时间范围内)。这是否暗示了一个解决方案?这是nvk_媒体字段。你能发布你有哪些索引吗?