Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Выбрать просроченные заявки

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
lex-romanow
Отправлено: 26 Октября, 2015 - 23:59:20
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Сент. 2014  


Помог: 0 раз(а)




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

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

Прошу помочь с запросом, перепробовал разные вариации запроса, но все не так. Спасибо.
(Добавление)
Вот написал запрос - тыц, пока указал 1 DAY. По первым тестам работает, но мне не нравится, что пока просрочка не сработает, то выводится поле с пустым значением во втором столбце второй строки, нужно вторую строку вообще не выводить в этом случае, но как? И вообще как запрос составлен, лучше можно?
 
 Top
Faraon-san
Отправлено: 27 Октября, 2015 - 10:08:23
Post Id



Посетитель


Покинул форум
Сообщений всего: 318
Дата рег-ции: Сент. 2013  


Помог: 8 раз(а)




не грузятся твои ссылки, вставь суда запрос.
 
 Top
lex-romanow
Отправлено: 27 Октября, 2015 - 11:20:30
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Сент. 2014  


Помог: 0 раз(а)




sqlfiddle работает с переменным успехом, поэтому выложу тут код:

Таблицы и заполнение:
CODE (SQL):
скопировать код в буфер обмена
  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');

Запрос по-первой ссылке (Запрос конечно не верен, не могу придумать как его верно написать. Пока выводит все.):
CODE (SQL):
скопировать код в буфер обмена
  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. По первым тестам работает, но мне не нравится, что пока просрочка не сработает, то выводится поле с пустым значением во втором столбце второй строки, нужно вторую строку вообще не выводить в этом случае, но как? И вообще как запрос составлен, лучше можно?):
CODE (SQL):
скопировать код в буфер обмена
  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 день).

Во втором запросе я почти добился того, что нужно, но хотелось бы довести запрос до ума.
 
 Top
Мелкий Супермодератор
Отправлено: 27 Октября, 2015 - 14:13:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT /**/ FROM client_bid WHERE client_id NOT IN (SELECT client_id FROM client_login WHERE client_login_date > NOW() - interval '1 day') AND `client_bid_blocked` = 'n'

В зависимости от версии mysql и температуры луны может оказаться эффективнее not exists по подзапросу или LEFT JOIN


-----
PostgreSQL DBA
 
 Top
lex-romanow
Отправлено: 27 Октября, 2015 - 14:24:39
Post Id


Новичок


Покинул форум
Сообщений всего: 24
Дата рег-ции: Сент. 2014  


Помог: 0 раз(а)




Мелкий пишет:
В зависимости от версии mysql и температуры луны может оказаться эффективнее not exists по подзапросу или LEFT JOIN

спасибо, через not exists сделал
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT a.`client_bid_id`
  2. FROM `client_bid` a
  3. WHERE a.`client_bid_blocked` = 'n'
  4. AND NOT EXISTS
  5. (
  6.         SELECT 1
  7.         FROM `client_login` b
  8.         WHERE b.`client_id` = a.`client_id`
  9.         AND b.`client_login_type` = 'success'
  10.         AND b.`client_login_date` > NOW() - INTERVAL 1 DAY
  11. )

(Отредактировано автором: 27 Октября, 2015 - 14:26:24)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB