0

我想要做的是创建 1 个查询,它将执行以下检查:

我在“yesnotmp”数据库​​中都有 2 个表。一个被称为msg_t包含所有消息,它有很多列。我在这个查询中关心的是这两个send_time, status, phone, sushi_sub_id

在这里,我得到了昨天所有的电话,sushi_sub_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'

我想做的是在retry桌子上检查有多少phone插入了相同的内容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`
4

2 回答 2

3

我建议稍作改动......不要通过选择每列来求和,而是简单地加入并直接计算它们。首先,您的 LEFT-JOIN 到 Msg_T 表但在 Msg_T 表上有 WHERE 子句强制它进入 INNER JOIN。

您正在寻找给定日期和状态之间的消息时间活动。为了帮助优化查询,我将在 (status, send_time) 上的 MSG_T 上有一个索引,以便它可以直接跳转到您的“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 参考...现在,知道字段的正确表,我会确保 msg_t 表在查询的所有 4 个部分上都有索引。

(状态,send_time,电话,sushi_sub_id)

至于“MAX(CASE ...)”。由于这是通过对各个列的重试表进行左连接来完成的,因此如果它有任何记录(1 条或更多),则“电话”将具有有效值。如果不存在这样的记录,它将为 NULL。

于 2013-06-03T12:34:04.980 回答
2

您缺少 group by 子句。我会尝试用存在替换计数(*):

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
于 2013-06-03T12:08:04.333 回答