Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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
Php 将两个sql查询合并为一个查询速度太慢_Php_Mysql_Sql - Fatal编程技术网

Php 将两个sql查询合并为一个查询速度太慢

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`)

我要做的是创建一个查询 哪个将执行以下检查:

“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`)
        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';