Php 将两个sql查询合并为一个查询速度太慢
我要做的是创建一个查询 哪个将执行以下检查: “yesnotmp”数据库中有两个表。 一个叫做msg\u t,它包含所有的消息,它有很多列。我在这个查询中关心的是这两个发送时间、状态、电话、寿司子id 在这里,我得到了昨天所有的电话、寿司和身份证记录。它是有效的Php 将两个sql查询合并为一个查询速度太慢,php,mysql,sql,Php,Mysql,Sql,我要做的是创建一个查询 哪个将执行以下检查: “yesnotmp”数据库中有两个表。 一个叫做msg\u t,它包含所有的消息,它有很多列。我在这个查询中关心的是这两个发送时间、状态、电话、寿司子id 在这里,我得到了昨天所有的电话、寿司和身份证记录。它是有效的 SELECT phone, sushi_sub_id FROM `yesnotmp`.`msg` LEFT JOIN `yesnotmp`.`msg_t` ON (`msg`.`id`=`msg_t`.`msg_id`)
SELECT phone, sushi_sub_id FROM `yesnotmp`.`msg`
LEFT JOIN `yesnotmp`.`msg_t` ON (`msg`.`id`=`msg_t`.`msg_id`)
WHERE `msg_t`.`send_time` BETWEEN '2013-06-02' AND '2013-06-03'
AND `msg_t`.`status` = 'Failure.Provider.Connection'
我想做的是在重试表上检查有多少手机插入了相同的sushi_sub____Id,有多少没有。这个查询需要很长时间
SELECT
Sum(CASE WHEN (SELECT Count(*) FROM `retry` AS `rty` WHERE `rty`.`phone` = `msgs`.`phone` AND `rty`.`sushi_subscription_id`=`msgs`.`sushi_sub_id`) > 0 THEN 1 ELSE 0 END) AS `In_Retry`,
Sum(CASE WHEN (SELECT Count(*) FROM `retry` AS `rty` WHERE `rty`.`phone` = `msgs`.`phone` AND `rty`.`sushi_subscription_id`=`msgs`.`sushi_sub_id`) > 0 THEN 0 ELSE 1 END) AS `Not_In_Retry`
FROM
(SELECT phone, sushi_sub_id FROM `yesnotmp`.`msg`
LEFT JOIN `yesnotmp`.`msg_t` ON (`msg`.`id`=`msg_t`.`msg_id`)
WHERE `msg_t`.`send_time` BETWEEN '2013-06-02' AND '2013-06-03'
AND `msg_t`.`status` = 'Failure.Provider.Connection') AS `msgs`
您缺少GROUPBY子句。我将尝试用exists替换count*:
SELECT
Sum(CASE WHEN exists(SELECT 1 FROM `retry` AS `rty`
WHERE `rty`.`phone` = `msgs`.`phone`
AND `rty`.`sushi_subscription_id`=`msgs`.`sushi_sub_id`)
THEN 1 ELSE 0 END) AS `In_Retry`,
Sum(CASE WHEN exists(SELECT 1 FROM `retry` AS `rty`
WHERE `rty`.`phone` = `msgs`.`phone`
AND `rty`.`sushi_subscription_id`=`msgs`.`sushi_sub_id`)
THEN 0 ELSE 1 END) AS `Not_In_Retry`,
phone, sushi_sub_id
FROM
(SELECT phone, sushi_sub_id FROM `yesnotmp`.`msg`
LEFT JOIN `yesnotmp`.`msg_t` ON (`msg`.`id`=`msg_t`.`msg_id`)
WHERE `msg_t`.`send_time` BETWEEN '2013-06-02' AND '2013-06-03'
AND `msg_t`.`status` = 'Failure.Provider.Connection') AS `msgs`
GROUP BY phone, sushi_sub_id
您缺少GROUPBY子句。我将尝试用exists替换count*:
SELECT
Sum(CASE WHEN exists(SELECT 1 FROM `retry` AS `rty`
WHERE `rty`.`phone` = `msgs`.`phone`
AND `rty`.`sushi_subscription_id`=`msgs`.`sushi_sub_id`)
THEN 1 ELSE 0 END) AS `In_Retry`,
Sum(CASE WHEN exists(SELECT 1 FROM `retry` AS `rty`
WHERE `rty`.`phone` = `msgs`.`phone`
AND `rty`.`sushi_subscription_id`=`msgs`.`sushi_sub_id`)
THEN 0 ELSE 1 END) AS `Not_In_Retry`,
phone, sushi_sub_id
FROM
(SELECT phone, sushi_sub_id FROM `yesnotmp`.`msg`
LEFT JOIN `yesnotmp`.`msg_t` ON (`msg`.`id`=`msg_t`.`msg_id`)
WHERE `msg_t`.`send_time` BETWEEN '2013-06-02' AND '2013-06-03'
AND `msg_t`.`status` = 'Failure.Provider.Connection') AS `msgs`
GROUP BY phone, sushi_sub_id
我建议稍作改动。。。不要对每一列通过选择求和,而是简单地联接并直接计算它们。首先,您的左连接到Msg\u T表,但在Msg\u T表上使用WHERE子句将其强制为内部连接 您正在查找给定日期和状态之间的消息时间活动。为了帮助优化查询,我会在MSG\u T on status上设置一个索引,send\u time,这样它就可以直接跳转到Failure.Provider.Connection,然后直接跳转到相关的日期范围 现在,返回重试表。这可能是一个左连接,因为如果我在这方面出错,您可能永远不会有重试条目更正我
SELECT
msg_t.phone,
msg_t.sushi_sub_id,
max( case when rty.phone is not null then 1 else 0 end ) as In_Retry,
max( case when rty.phone is null then 1 else 0 end ) as Not_In_Retry
FROM
yesnotmp.msg_t msg_t
JOIN yesnotmp.msg msg
ON msg_t.msg_id = msg.id
LEFT JOIN `retry` rty
ON msg_t.phone = rty.phone
AND msg_t.sushi_sub_id = rty.sushi_subscription_id
WHERE
msg_t.status = 'Failure.Provider.Connection'
AND msg_t.send_time BETWEEN '2013-06-02' AND '2013-06-03'
GROUP BY
msg_t.phone,
msg_t.sushi_sub_id
编辑-
根据编辑尝试调整,以澄清电话、sushi_sub_id参考的alias.field。。。现在,知道了字段的正确表,我将确保msg_t table在查询的所有4个部分上都有索引
状态、发送时间、电话、寿司子id
至于马克斯案。。。。由于这是通过左键连接到相应列上的重试表来完成的,因此如果有任何记录1或更多,手机将具有有效值。如果不存在这样的记录,它将是空的。我建议稍微修改一下。。。不要对每一列通过选择求和,而是简单地联接并直接计算它们。首先,您的左连接到Msg\u T表,但在Msg\u T表上使用WHERE子句将其强制为内部连接 您正在查找给定日期和状态之间的消息时间活动。为了帮助优化查询,我会在MSG\u T on status上设置一个索引,send\u time,这样它就可以直接跳转到Failure.Provider.Connection,然后直接跳转到相关的日期范围 现在,返回重试表。这可能是一个左连接,因为如果我在这方面出错,您可能永远不会有重试条目更正我
SELECT
msg_t.phone,
msg_t.sushi_sub_id,
max( case when rty.phone is not null then 1 else 0 end ) as In_Retry,
max( case when rty.phone is null then 1 else 0 end ) as Not_In_Retry
FROM
yesnotmp.msg_t msg_t
JOIN yesnotmp.msg msg
ON msg_t.msg_id = msg.id
LEFT JOIN `retry` rty
ON msg_t.phone = rty.phone
AND msg_t.sushi_sub_id = rty.sushi_subscription_id
WHERE
msg_t.status = 'Failure.Provider.Connection'
AND msg_t.send_time BETWEEN '2013-06-02' AND '2013-06-03'
GROUP BY
msg_t.phone,
msg_t.sushi_sub_id
编辑-
根据编辑尝试调整,以澄清电话、sushi_sub_id参考的alias.field。。。现在,知道了字段的正确表,我将确保msg_t table在查询的所有4个部分上都有索引
状态、发送时间、电话、寿司子id
至于马克斯案。。。。由于这是通过左键连接到相应列上的重试表来完成的,因此如果有任何记录1或更多,手机将具有有效值。如果不存在这样的记录,它将是空的。您说“它有效”,但WHERE子句有效地将您的左[outer]连接呈现为[inner]连接,因此您不妨这样开始编写它。。。从msg m JOIN msg_t ON t.msg_id=m.id中选择m.phone、m.sushi_sub_id,其中t.send_时间介于'2013-06-02'和'2013-06-03'之间,t.status='Failure.Provider.Connection';你说“它有效”,但WHERE子句有效地将你的左[outer]连接呈现为[inner]连接,因此你不妨这样写,开始。。。从msg m JOIN msg_t ON t.msg_id=m.id中选择m.phone、m.sushi_sub_id,其中t.send_时间介于'2013-06-02'和'2013-06-03'之间,t.status='Failure.Provider.Connection';