У меня есть таблица, которая содержит эти значения
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
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();
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
Вы можете присоединиться к подзапросу. Подзапрос возвращает список имен пользователей, срок действия которых истек.