查看可以为空的字段之间的连接
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)
。
我有 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)
。