我有包含此值的表
id username attribute op value
1 asd Cleartext-password := text
2 asd expiration := 02 DEC 2017 2:5:30
3 asd ftg-quota := 500
我们可以注意到,username列具有相同的值,但其他列具有不同的值 如果他的帐户已过期,我想选择所有用户的信息(如果属性=到期和值,我可以知道他的帐户是否已过期
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
答案 0 :(得分: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
您可以加入子查询。子查询返回已过期的用户名列表。
答案 1 :(得分:0)
expiration
是聚合结果。它在聚合之前不存在,因此不能在WHERE
中使用。请改用HAVING
。
然后你想比较日期时间,但你要比较字符串。但是字符串'02 JAN 1900 12:34'
例如大于'01 DEC 2017 12:34'
,因为字符串比较没有内置日期检测,但是通过字符('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();