mysql列别名

tcbh2hod  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(298)

在下面的查询中,我有两个表, search_result 以及 login_details .

SELECT fullname,
(SELECT MAX(login_time) FROM login_details WHERE reg_id=registration) as login_time 
FROM search_result WHERE hire_work=0;

注:reg\ U id是中的一列 login_details “注册”列在 search_result 通过执行上面的查询,我得到了所有用户的全名和最后一次登录时间 search_result table。
现在,我的要求是获取所有的用户以及最后一次登录的时间谁都没有登录,从今天起的最后180天。当我添加 WHERE 条件类似 login_time > '2018-05-22 18:09:00' ,它显示错误未知列登录时间等等。。。。。
查询:

SELECT fullname,
(SELECT MAX(login_time) FROM login_details WHERE reg_id=registration) as login_time 
FROM search_result WHERE hire_work=0 AND login_time > '2018-05-22 18:09:00';

请帮我找到确切的查询。请回答。谢谢

nqwrtyyt

nqwrtyyt1#

查询不起作用,因为where语句在select语句之前执行。您应该使用having语句来过滤计算字段。例如:

SELECT fullname,
  (SELECT MAX(login_time)
   FROM login_details
   WHERE reg_id=registration) AS login_time
FROM search_result
WHERE hire_work=0
GROUP BY fullname
HAVING login_time < '2018-05-22 18:09:00'

而且,子查询也不是很好的做法。可以使用join重写此查询

SELECT search_result.fullname,
       MAX(login_details.login_time) AS login_time
FROM search_result
JOIN login_details ON login_details.reg_id=search_result.registration
WHERE search_result.hire_work=0
GROUP BY fullname
HAVING login_time < '2018-05-22 18:09:00'

还有。。您可以使用以下表达式代替固定日期: NOW() - INTERVAL 180 DAY . 例如:

SELECT search_result.fullname,
       MAX(login_details.login_time) AS login_time
FROM search_result
JOIN login_details ON login_details.reg_id=search_result.registration
WHERE search_result.hire_work=0
GROUP BY fullname
HAVING login_time < NOW() - INTERVAL 180 DAY
2skhul33

2skhul332#

不能使用别名(在“选择零件”中指定)的原因是,此零件在where part之后执行。因此,当SQLServer执行where part时,这些别名不可用。
我不会无缘无故地使用查询,因为对于SQLServer来说,它们通常需要更高的资源开销。
由于您的目标用户在指定的日期时间之后没有登录,因此根本不需要查找最大登录时间,简单的左联接就足够了:

SELECT
      sr.fullname
FROM
    search_result AS sr
    LEFT JOIN login_details AS ld ON (
            ld.reg_id = sr.registration
        AND ld.login_time > '2018-05-22 18:09:00'
    )
WHERE
        sr.hire_work = 0
    AND ld.login_time IS NULL
;

如果仍需要此类用户的上次登录时间(即在指定的日期时间之前),则可以添加另一个子查询(如在原始查询中),如下所示:

SELECT
      sr.fullname
    , (
        SELECT
            MAX(login_details.login_time)
        FROM
            login_details
        WHERE
            login_details.reg_id = sr.registration
    ) AS last_login_time
FROM
    search_result AS sr
    LEFT JOIN login_details AS ld ON (
            ld.reg_id = sr.registration
        AND ld.login_time > '2018-05-22 18:09:00'
    )
WHERE
        sr.hire_work = 0
    AND ld.login_time IS NULL
;

相关问题