具有条件的Mysql HAVING子句,如果可能的话

时间:2017-01-03 20:59:05

标签: mysql sql

您好我想知道以下HAVING子句是否有效

SELECT
  m.id,
  m.username,
  m.name,
  m.department,
  dp.department as dep,
  dp.id,
  (
    SELECT SEC_TO_TIME( SUM( TIME_TO_SEC( `time` ) ) )
    FROM time_management tm
    WHERE 
      tm.user = m.id
      AND MONTH(`date`) = MONTH(CURRENT_DATE())
      AND YEAR(`date`)= YEAR(CURRENT_DATE())
  ) as time
FROM
  members m 
  LEFT JOIN department dp ON m.department = dp.id   
WHERE m.department = $departmentvar
HAVING (($key - time) > 34)

在这种情况下$key = 100

time = 5:00:00

这个想法是只选择满足时间不够的条件的结果,例如

显示具有time = 5:00:00的结果,因为(100-5)= 95> 34 但是不显示具有time = 95:00:00的结果,因为(100-95)= 5> 34 例如?

1 个答案:

答案 0 :(得分:0)

是的,可以在HAVING子句中包含表达式。

但是MySQL并不知道如何处理令牌$key,如果这是发送的SQL文本的一部分。

也许客户端程序正在进行一些变量替换来生成一个字符串,并且$key将被替换为将要发送给MySQL的字符串中的100 ...&#39这是我们可能会在这里做出的假设。但这是一个假设。您似乎在询问发送给MySQL的SQL语句。

只返回时间不够的行",在HAVING子句中确实可以使用该条件。

结果集中的time列将是数据类型TIME。

但是我对这个结构感到困惑......

  100 - time  > 34

为什么要从数字文字中减去TIME数据类型?

如果我们想要比较TIME数据类型,将它与另一种TIME数据类型进行比较或将TIME转换为秒数会更有意义。

(它完全不清楚10034代表什么。)

好像你想做类似的事情:

 HAVING time < '01:06:00'

 HAVING time < SEC_TO_TIME(( 100 - 34 )*60)

或者

 HAVING ( 100 - TIME_TO_SEC(time) ) > 34

目前还不清楚你想要达到的目标,所以这些只是一些看似比原版更有效的模式。