MySQL Получить необработанные SMS - PullRequest
0 голосов
/ 03 февраля 2012

Я использую Gammu на своем сервере для настройки шлюза SMS, но у меня возникла проблема, когда я переходил от получения идентификаторов, чтобы просто получить необработанные SMS-сообщения из БД Gammu (в MySQL)Часть таблицы входящих сообщений выглядит следующим образом:

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

Если SMS содержит более 160 букв, оно разделяется на несколько записей, обозначенных UDH.UDH создается

  1. частью UDH (050003), указывающей, что это SMS.
  2. часть UDH (4A02) является уникальным идентификатором.
  3. часть UDH (01) является частью номера SMS.

Я могу проверить, полностью ли получено SMS, если TextDecoded (последней записи с длинным SMS (с UDH)) меньше 156 букв или TheRecevingDateTimeболее 3 минут.

Мне нужно создать хранимые процедуры для получения SMS (здесь SMS может быть длиной более 160 писем) и получения всех новых SMS (если 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 ;

Но я не могу понять, как создать хранимую процедуру для получения всех новых SMS.

** РЕДАКТИРОВАТЬ **

  • Должны быть получены все новые SMS
  • Длинное SMS получено, когда последняя запись (с UDH) получена позже, чем через 3 минуты из-за TheReceivingDateTime или TextDecoded короче 156 букв
  • SMS-сообщение без UDH только что получено (его нельзя сочетать с другими SMS-сообщениями без UDH)

Iнадеюсь, вы понимаете мой вопрос

Ответы [ 2 ]

1 голос
/ 03 февраля 2012
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

. Это даст список идентификатороввы можете пробежать свой GetSMS

0 голосов
/ 03 февраля 2012

Это утверждение должно дать вам желаемый результат, если я не неправильно понимаю формат, его легко поместить в хранимую процедуру.хотите изменить последнее условие на основе типа столбца в вашей схеме)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...