За последние 24 часа нас посетили 53695 программистов и 1636 роботов. Сейчас ищут 1080 программистов ...

Выбрать просроченные заявки

Тема в разделе "MySQL", создана пользователем lex-romanow, 27 окт 2015.

  1. lex-romanow

    lex-romanow Активный пользователь

    С нами с:
    24 сен 2014
    Сообщения:
    50
    Симпатии:
    1
    Всем привет. Есть 2 таблицы - "заявки" и "логи авторизации клиента". Связь между таблицами по полю `client_id`. Посмотрите пример, там я наглядно все выложил - тыц. Запрос конечно не верен, не могу придумать как его верно написать. Пока выводит все.

    Как я вижу работу запроса - запрос выбирает все заявки, которые не заблокированы, потом ищет владельца заявки со статусом success и смотрит дату последнего его входа (сортируем по убыванию дабы самая свежая дата была вверху, указываем лимит 1), если дата последнего входа превышает 1 день, то выводим ИД этой заявки для дальнейшей обработки.

    Прошу помочь с запросом, перепробовал разные вариации запроса, но все не так. Спасибо.
     
  2. lex-romanow

    lex-romanow Активный пользователь

    С нами с:
    24 сен 2014
    Сообщения:
    50
    Симпатии:
    1
    Вот написал запрос - тыц, пока указал 1 DAY. По первым тестам работает, но мне не нравится, что пока просрочка не сработает, то выводится поле с пустым значением во втором столбце второй строки, нужно вторую строку вообще не выводить в этом случае, но как? И вообще как запрос составлен, лучше можно?
     
  3. lex-romanow

    lex-romanow Активный пользователь

    С нами с:
    24 сен 2014
    Сообщения:
    50
    Симпатии:
    1
    sqlfiddle работает с переменным успехом, поэтому выложу тут код:

    Таблицы и заполнение:
    Код (PHP):
    1. CREATE TABLE `client_bid` (
    2.   `client_bid_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    3.   `client_id` int(8) unsigned NOT NULL DEFAULT '0',
    4.   `client_bid_blocked` enum('y','n') NOT NULL DEFAULT 'n',
    5.   PRIMARY KEY (`client_bid_id`)
    6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    7.  
    8. INSERT INTO `client_bid` (`client_bid_id`, `client_id`, `client_bid_blocked`) VALUES
    9.     (1, 1, 'n'),
    10.     (2, 4, 'y'),
    11.     (3, 4, 'n');
    12.  
    13. CREATE TABLE `client_login` (
    14.   `client_login_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    15.   `client_id` int(8) unsigned NOT NULL DEFAULT '0',
    16.   `client_login_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    17.   `client_login_type` enum('wait','success','failed') NOT NULL DEFAULT 'wait',
    18.   PRIMARY KEY (`client_login_id`)
    19. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    20.  
    21. INSERT INTO `client_login` (`client_login_id`, `client_id`, `client_login_date`, `client_login_type`) VALUES
    22.     (1, 1, '2015-05-24 16:06:03', 'success'),
    23.     (2, 1, '2015-05-24 18:19:39', 'success'),
    24.     (3, 1, '2015-05-24 18:21:07', 'success'),
    25.     (4, 1, '2015-05-24 18:22:21', 'success'),
    26.     (5, 1, '2015-05-24 18:24:35', 'success'),
    27.     (6, 1, '2015-05-28 16:20:42', 'success'),
    28.     (7, 1, '2015-05-28 16:32:56', 'success'),
    29.     (8, 1, '2015-05-28 16:46:47', 'success'),
    30.     (9, 1, '2015-05-28 17:46:57', 'success'),
    31.     (10, 1, '2015-05-29 18:56:03', 'success'),
    32.     (11, 1, '2015-05-29 19:28:52', 'success'),
    33.     (12, 1, '2015-05-29 19:32:25', 'success'),
    34.     (13, 1, '2015-05-29 19:57:37', 'success'),
    35.     (14, 1, '2015-05-30 12:37:56', 'wait'),
    36.     (15, 1, '2015-05-30 12:38:50', 'failed'),
    37.     (16, 1, '2015-05-30 12:38:58', 'failed'),
    38.     (17, 1, '2015-05-30 13:21:18', 'wait'),
    39.     (18, 1, '2015-05-30 20:12:11', 'success'),
    40.     (19, 1, '2015-06-02 20:49:12', 'success'),
    41.     (20, 1, '2015-06-02 22:52:09', 'success'),
    42.     (21, 1, '2015-06-02 22:54:32', 'success'),
    43.     (22, 1, '2015-06-03 13:45:09', 'success'),
    44.     (23, 1, '2015-06-05 12:47:24', 'success'),
    45.     (24, 1, '2015-06-05 19:50:08', 'success'),
    46.     (25, 1, '2015-07-21 10:09:48', 'success'),
    47.     (26, 1, '2015-07-21 10:29:47', 'wait'),
    48.     (27, 1, '2015-07-21 10:31:03', 'success'),
    49.     (28, 1, '2015-07-21 10:31:21', 'failed'),
    50.     (29, 1, '2015-07-21 14:59:10', 'wait'),
    51.     (30, 1, '2015-07-21 14:59:45', 'success'),
    52.     (31, 1, '2015-07-21 15:00:32', 'failed'),
    53.     (39, 1, '2015-07-21 20:01:37', 'wait'),
    54.     (40, 1, '2015-07-21 20:13:12', 'success'),
    55.     (41, 1, '2015-07-25 14:08:54', 'wait'),
    56.     (42, 1, '2015-07-25 14:20:34', 'wait'),
    57.     (43, 1, '2015-07-25 14:24:18', 'wait'),
    58.     (44, 1, '2015-07-26 18:06:08', 'success'),
    59.     (45, 1, '2015-07-26 19:01:59', 'wait'),
    60.     (46, 1, '2015-07-26 21:47:41', 'wait'),
    61.     (47, 1, '2015-07-26 21:53:27', 'wait'),
    62.     (48, 1, '2015-07-26 22:34:46', 'success'),
    63.     (58, 1, '2015-09-17 21:05:48', 'wait'),
    64.     (59, 2, '2015-09-17 22:32:07', 'wait'),
    65.     (60, 2, '2015-09-17 22:33:46', 'wait'),
    66.     (61, 3, '2015-09-17 22:36:34', 'wait'),
    67.     (62, 1, '2015-09-17 22:43:50', 'wait'),
    68.     (63, 1, '2015-09-17 22:44:31', 'wait'),
    69.     (64, 1, '2015-09-18 01:13:20', 'wait'),
    70.     (65, 1, '2015-09-18 01:14:13', 'wait'),
    71.     (66, 1, '2015-10-16 19:30:13', 'success'),
    72.     (67, 1, '2015-10-22 23:22:31', 'success'),
    73.     (68, 1, '2015-10-23 17:31:42', 'success'),
    74.     (69, 1, '2015-10-23 17:32:09', 'failed'),
    75.     (70, 1, '2015-10-23 17:34:57', 'success'),
    76.     (71, 1, '2015-10-23 17:36:17', 'success'),
    77.     (72, 1, '2015-10-23 17:37:34', 'success'),
    78.     (73, 1, '2015-10-23 17:58:51', 'success'),
    79.     (74, 1, '2015-10-23 18:07:19', 'wait'),
    80.     (75, 1, '2015-10-23 18:07:46', 'failed'),
    81.     (76, 1, '2015-10-23 18:09:05', 'success'),
    82.     (77, 1, '2015-10-23 18:10:40', 'success'),
    83.     (78, 1, '2015-10-23 19:02:15', 'success'),
    84.     (79, 1, '2015-10-23 19:04:27', 'success'),
    85.     (80, 1, '2015-10-23 19:05:48', 'success'),
    86.     (81, 1, '2015-10-23 21:28:25', 'success'),
    87.     (82, 1, '2015-10-23 21:32:41', 'success'),
    88.     (83, 1, '2015-10-23 21:34:19', 'success'),
    89.     (84, 1, '2015-10-23 21:36:24', 'success'),
    90.     (85, 1, '2015-10-23 21:37:30', 'success'),
    91.     (86, 1, '2015-10-23 21:56:07', 'wait'),
    92.     (87, 1, '2015-10-23 22:09:11', 'wait'),
    93.     (88, 1, '2015-10-23 22:11:06', 'success'),
    94.     (89, 1, '2015-10-23 22:17:27', 'success'),
    95.     (90, 1, '2015-10-24 20:04:45', 'success'),
    96.     (91, 1, '2015-10-24 20:16:37', 'success'),
    97.     (92, 1, '2015-10-26 19:14:43', 'success'),
    98.     (93, 1, '2015-10-26 19:32:34', 'success'),
    99.     (94, 4, '2015-10-27 00:15:34', 'success'),
    100.     (95, 4, '2015-10-26 01:25:46', 'failed'); 
    Запрос по-первой ссылке (Запрос конечно не верен, не могу придумать как его верно написать. Пока выводит все.):
    Код (PHP):
    1. SELECT a.`client_bid_id`,
    2.        b.`client_login_date`
    3. FROM `client_bid` a
    4. JOIN `client_login` b ON (b.`client_id` = a.`client_id` AND b.`client_login_type` = 'success')
    5. WHERE a.`client_bid_blocked` = 'n' 
    Запрос по-второй ссылке (Пока указал 1 DAY. По первым тестам работает, но мне не нравится, что пока просрочка не сработает, то выводится поле с пустым значением во втором столбце второй строки, нужно вторую строку вообще не выводить в этом случае, но как? И вообще как запрос составлен, лучше можно?):
    Код (PHP):
    1. SELECT `client_bid`.`client_bid_id` as `id`,
    2.        (
    3.              SELECT `client_login`.`client_login_date` 
    4.             FROM `client_login` 
    5.             WHERE `client_login`.`client_id` = `client_bid`.`client_id` 
    6.             AND `client_login`.`client_login_type` = 'success' 
    7.             AND `client_login`.`client_login_date` < NOW() - INTERVAL 1 DAY 
    8.             ORDER BY `client_login`.`client_login_date` DESC 
    9.             LIMIT 1
    10.          ) as `date`
    11. FROM `client_bid`
    12. WHERE `client_bid`.`client_bid_blocked` = 'n' 
    Описание таблиц с полями и постановка задачи.

    client_bid - таблица заявок
    -- client_bid_id - ид заявки
    -- client_id - ид того кто заявку составил
    -- client_bid_blocked - заблокирована или нет заявка

    client_login - таблица входов клиента в панель
    -- client_login_id - ид входа
    -- client_id - ид того кто вошел в панель
    -- client_login_date - дата и время входа
    -- client_login_type - тип входа (wait - ожидание кода подтверждения входа, success - успешный вход, failed - ошибка при входе)

    Нужно - выбрать заявки, которые являются просроченными (потом я их заблокирую). Просроченной заявкой я считаю ту, у которой создатель не входил в панель более 1 дня (цифра будет другая, для теста беру 1 день).

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

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]