在同一个表中左连接mysql查询

时间:2017-12-13 12:06:12

标签: mysql sql

我有包含此值的表

 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

2 个答案:

答案 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();