MySQL获取未处理的短信

时间:2012-02-03 18:30:44

标签: mysql stored-procedures

我在我的服务器上使用Gammu来设置一个SMS网关,但是我遇到了一个问题,当我从接收ID转移到从Gammu的DB(在MySQL中)获取任何未经处理的SMS时
收件箱表中的一些内容如下所示

|     UDH      |       TextDecoded        | ID | Processed |
| 0500034A0201 | Some long text (156 l.)  |  1 |   false   |
| 0500034A0202 | Some continuing text     |  2 |   false   | 
|              | An SMS (less than 160 l) |  3 |   false   |

如果短信超过160个字母,短信会被UDH指示的多个条目分开 UDH

创建
  1. UDH(050003)的一部分表示它是短信。
  2. UDH(4A02)的一部分是唯一标识符。
  3. UDH(01)的一部分是SMS的部分编号。
  4. 如果TextDecoded(带有长短信的最后一个条目(UDH))小于156个字母或TheRecevingDateTime,我可以查看是否已完全收到短信超过3分钟。

    我需要创建存储过程以获取短信(此处短信可以超过160个字母)和获取所有新短信(如果Processed为假)。
    我已经创建了一个如何获取SMS的示例,看起来像

    DELIMITER €€
    CREATE PROCEDURE `GetSMS`(IN smsid int(10))
       BEGIN
          DECLARE smsudh TEXT;
          SELECT `UDH` INTO smsudh FROM `inbox` WHERE `ID`=smsid;
          IF (STRCMP(smsudh, '') < 1) THEN
             SELECT * FROM `inbox` WHERE `ID`=smsid;
          ELSE
             SELECT * FROM `inbox` WHERE `UDH` LIKE CONCAT(LEFT(smsudh, (LENGTH(smsudh)-2)), "%") GROUP BY `ID` ORDER BY `UDH`;
          END IF;
       END €€
    DELIMITER ;
    

    但我无法弄清楚如何创建一个存储过程来获取所有新短信。

    **编辑**

    • 应该收到所有新短信
    • 由于UDHTheReceivingDateTime短于156个字母而导致最后一个条目(TextDecoded)收到的时间超过3分钟,会收到长短信
    • 刚收到没有UDH的短信(不应与没有UDH的其他短信合并)

    我希望你理解我的问题

2 个答案:

答案 0 :(得分:1)

SELECT id FROM (
  SELECT
    MIN(id) as id,
    MIN(UDH) as udh,
    MIN(LENGTH(TextDecoded)) as txtlen,
    MAX(TheReceivingDateTime)-DATE_ADD(MIN(TheReceivingDateTime), INTERVAL 3 MINUTE) AS rcvtimeout
  FROM inbox
  WHERE
    Processed='false'
  GROUP BY
    IF(UDH='',id,SUBSTR(UDH,1,10))
  HAVING rcvtimeout>0
    OR udh=''
    OR txtlen<156
  ) AS baseview
ORDER BY id;

由于我们无法按时间间隔where进行过滤,因此我们将其用作组功能并按having过滤

这将返回一个id列表,您可以通过GetSMS

运行

答案 1 :(得分:0)

如果我没有误解格式,这个语句应该给你想要的输出,应该很容易放入存储过程。

SELECT 
  SUBSTR(UDH,7,4) uid, 
  Processed, 
  GROUP_CONCAT(TextDecoded ORDER BY SUBSTR(UDH,11,2) SEPARATOR '') text 
FROM SMS_table 
GROUP BY 
  SUBSTR(UDH,7,4) having processed<>1;

(在这种情况下处理为int,您可能希望根据模式中的列类型更改最后一个条件)