我在我的服务器上使用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
由
UDH
(050003)的一部分表示它是短信。UDH
(4A02)的一部分是唯一标识符。UDH
(01)的一部分是SMS的部分编号。如果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 ;
但我无法弄清楚如何创建一个存储过程来获取所有新短信。
**编辑**
UDH
或TheReceivingDateTime
短于156个字母而导致最后一个条目(TextDecoded
)收到的时间超过3分钟,会收到长短信UDH
的短信(不应与没有UDH
的其他短信合并)我希望你理解我的问题
答案 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,您可能希望根据模式中的列类型更改最后一个条件)