查看可以为空的字段之间的连接

View with join between field that can be null

我有 2 个 table,每个都有 50,000 多条记录,每一个都是这样。

CREATE TABLE IF NOT EXISTS `call_attempt` (
  `csvleads_id_fk` int(11) NOT NULL,
  `users_id_fk` int(11) NOT NULL,
  `status` int(11) NOT NULL,
  `call_id` varchar(50) default NULL,
  KEY `csvlead` (`csvleads_id_fk`),
  KEY `user_id` (`users_id_fk`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `recorded` (
  `record_id` int(11) NOT NULL auto_increment,
  `agent_id_fk` int(11) NOT NULL,
  `lead_id_fk` int(11) NOT NULL,
  `duration` int(11) NOT NULL,
  `recording_url` text collate utf8_unicode_ci NOT NULL,
  `recorded_at` timestamp NULL default NULL,
  `call_id` varchar(50) character set utf8 default NULL,
  PRIMARY KEY  (`record_id`),
  UNIQUE KEY `filterme` (`recording_url`(100))
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=72158 ;

我添加了一个 call_id 字段来生成 link。这意味着新记录必须填充这些字段,至少在 table call_attempt 中。

  call_attempt               recorded
-------------------       ----------------
users_id_fk call_id       call_id dutarion
-------------------       ----------------
1            NULL         NULL    10
2            NULL         NULL     8
3            NULL         NULL     5
4            NULL         ca12    19
50000        ca12         ca14     9
50001        ca13
50002        ca14         

我需要向我展示 table call_attempt 中的所有记录,并且如果您在 table 中找到记录 记录时长带


我尝试了 LEFT JOIN,但需要超过 50 秒。

SELECT 
        `cal`.`csvleads_id_fk` AS `Id`,
        `rc`.`duration` AS `duration`
    FROM `call_attempt` AS cal       
        LEFT JOIN recorded AS rc ON (cal.call_id = rc.call_id AND (rc.call_id IS NOT NULL))

84.625 秒/0.000 秒


接下来,我尝试对 SELECT table recorded 进行 LEFT JOIN,仅包含 [=60= 的记录] 不是 NULL 但不要让我创建视图。

CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `benscott`@`%` 
    SQL SECURITY DEFINER
VIEW `callHistory4` AS
SELECT 
        `cal`.`csvleads_id_fk` AS `Id`,        
        `rc`.`duration` AS `duration`
    FROM `call_attempt` AS cal              
        LEFT JOIN (SELECT call_id , duration FROM `recorded` WHERE call_id IS NOT NULL) AS rc ON (rc.call_id = cal.call_id)

错误代码:1349。视图的 SELECT 在 FROM 子句中包含一个子查询


然后我创建了另一个视图,其中只有来自 call_id 的结果 NOT NULL。

CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `benscott`@`%` 
    SQL SECURITY DEFINER
VIEW `view_recorded` AS
SELECT call_id , duration FROM `recorded` WHERE call_id IS NOT NULL

在新视图中我加入 view_recorded 但也需要 40 多秒。

SELECT 
        `cal`.`csvleads_id_fk` AS `Id`,
        `rc`.`duration` AS `duration`
    FROM `call_attempt` AS cal       
        LEFT JOIN view_recorded AS rc ON (rc.call_id = cal.call_id)

92.094 秒/0.000 秒


那么,我有哪些选择?谢谢!!

对于此查询:

SELECT `cal`.`csvleads_id_fk` AS `Id`, `rc`.`duration` AS `duration`
FROM `call_attempt_log` cal LEFT JOIN
     recorded_calls rc
     ON cal.call_id = rc.call_id AND rc.call_id IS NOT NULL;

最好的索引是recorded_calls(call_id, duration)