Оставить MySQL запрос в той же таблице

0

У меня есть таблица, которая содержит эти значения

 id   username   attribute             op  value 
  1     asd       Cleartext-password    :=   text
  2     asd       expiration            :=   02 DEC 2017 2:5:30
  3     asd       ftg-quota             :=    500

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

SELECT
  e.username,
  e.attribute,
  e.value AS expired,
  c.attribute,
  c.value AS password,
  c.telefon AS phone,
  c.adsoyad AS realname,
  c.email AS email
FROM radcheck e
LEFT JOIN radcheck c
  ON c.attribute = 'Cleartext-Password'
  AND e.attribute = 'Expiration'
WHERE DATE_FORMAT(STR_TO_DATE(e.value, '%d %M %Y %h:%i'), '%d %M %Y %h:%i') <= DATE_FORMAT(NOW(), '%d %M %Y %h:%i')
AND e.username = c.username
GROUP BY e.username

это еще один запрос, который я использовал без результата

SELECT
  c.username,
  MAX(CASE
    WHEN c.attribute = 'Cleartext-Password' THEN c.value
  END) AS password,
  MAX(CASE
    WHEN c.attribute = 'Expiration' THEN c.value
  END) AS expiration,
  MAX(CASE
    WHEN c.attribute = 'Ftg-Total-Limit' THEN c.value
  END) AS quta,
  MAX(CASE
    WHEN c.attribute = 'Simultaneous-Use' THEN c.value
  END) AS simul,
  MAX(CASE
    WHEN c.attribute = 'Max-All-Session' THEN c.value
  END) AS session,
  MAX(c.adsoyad) AS realname,
  MIN(c.dtarih) AS birthdate,
  MIN(c.telefon) AS phone,
  MIN(c.tcno) AS tc,
  MAX(c.email) AS email,
  MIN(c.id) AS id
FROM radcheck c
WHERE DATE_FORMAT(STR_TO_DATE(expiration, '%d %M %Y %h:%i'), '%d %M %Y %h:%i') <= DATE_FORMAT(NOW(), '%d %M %Y %h:%i')
GROUP BY c.username
Теги:

2 ответа

0

expiration во втором запросе - результат агрегации. Он не существует до агрегации и поэтому не может использоваться в WHERE. Вместо этого используйте HAVING.

Затем вы хотите сравнить datetimes, но вместо этого вы сравниваете строки. Но строка '02 JAN 1900 12:34' больше, чем '01 DEC 2017 12:34' например, поскольку сравнение строк не имеет встроенного определения даты, но сравнивает символ charater ('02...' > '01...').

Исправленный запрос:

SELECT
  username,
  MAX(CASE WHEN attribute = 'Cleartext-Password' THEN value END) AS password,
  MAX(CASE WHEN attribute = 'Expiration'         THEN value END) AS expiration,
  MAX(CASE WHEN attribute = 'Ftg-Total-Limit'    THEN value END) AS quta,
  MAX(CASE WHEN attribute = 'Simultaneous-Use'   THEN value END) AS simul,
  MAX(CASE WHEN attribute = 'Max-All-Session'    THEN value END) AS session,
  MAX(adsoyad) AS realname,
  MIN(dtarih) AS birthdate,
  MIN(telefon) AS phone,
  MIN(tcno) AS tc,
  MAX(email) AS email,
  MIN(id) AS id
FROM radcheck
GROUP BY username
HAVING STR_TO_DATE(MAX(CASE WHEN attribute = 'Expiration' THEN value END), '%d %M %Y %h:%i') <= NOW();
0
SELECT
  e.username,
  e.attribute,
  e.value AS password,
  e.telefon AS phone,
  e.adsoyad AS realname,
  e.email AS email
FROM radcheck e
     LEFT JOIN 
      (SELECT distinct username
       FROM radcheck e 
       WHERE DATE_FORMAT(STR_TO_DATE(e.value, '%d %M %Y %h:%i'), '%d %M %Y %h:%i') <= DATE_FORMAT(NOW(), '%d %M %Y %h:%i')
      ) c
ON c.username=e.username

Вы можете присоединиться к подзапросу. Подзапрос возвращает список имен пользователей, срок действия которых истек.

  • 0
    спасибо за ответ, но он не работает
  • 2
    «Не работает» ничего не значит. Что именно не работает? Есть ошибки? Работает ли подзапрос?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню