查询根据条件返回一个值

时间:2020-12-21 14:46:36

标签: mysql sql case

我有一张表格,用于保存以下数据: id - 自增 令牌 - 随机生成的令牌 when - 生成令牌时的时间戳

我有一个 php 页面,我在其中 POST 令牌值。在该页面上,我正在构建一个将执行两项检查的查询:

  • 令牌存在
  • 令牌是在不到 24 小时前创建的

我想要做的是将两个条件组合在一个查询中并作为响应:

  • 两个条件都满足时的id;
  • 令牌不存在的错误;
  • 令牌存在但创建时间超过 24 小时的错误。

我知道如何分别检查每个条件,例如检查令牌是否存在(示例被简化,但在现实生活中我使用的是准备好的语句):

SELECT id FROM table WHERE token='$token';

或者如果我知道令牌存在并且我想查看令牌是否是在不到 24 小时前创建的:

SELECT id FROM table WHERE token='$token' AND when > DATE_SUB(NOW(), INTERVAL 24 HOUR)  //untested

如何将所有内容合并到一个查询中?这样查询将返回 id/'no token'/'expired' 或者?不幸的是,我不太擅长使用 mysql 自己构建它

1 个答案:

答案 0 :(得分:1)

无论如何您都希望返回 1 行,即使表中不存在该令牌。
您可以使用聚合和 CASE 表达式执行此操作:

SELECT 
  CASE 
    WHEN MAX(id) IS NULL THEN 'no token'
    WHEN MAX(timestamp) < NOW() - INTERVAL 24 HOUR THEN 'expired'
    ELSE MAX(id)   
  END
FROM table 
WHERE token = '$token'

查看简化的 demo