Mysql 类型3如何使用having子句执行sql查询

Mysql 类型3如何使用having子句执行sql查询,mysql,typo3,Mysql,Typo3,这是我的SQL查询 select uid,starttime,endtime from table1 where endtime >= UNIX_TIMESTAMP() Group by uid having min(starttime) 当我使用phpmyadmin执行查询时,它会返回2行。但是当我使用Typo3执行时,查询返回27000行 $select = "uid,starttime,endtime"; $from ="table1"; $where = "endtime >

这是我的SQL查询

select uid,starttime,endtime
from table1
where endtime >= UNIX_TIMESTAMP()
Group by uid
having min(starttime)
当我使用phpmyadmin执行查询时,它会返回2行。但是当我使用Typo3执行时,查询返回27000行

$select = "uid,starttime,endtime";
$from ="table1";
$where = "endtime >= UNIX_TIMESTAMP()";
$groupby = "uid having min(starttime)";

$res = $GLOBALS["TYPO3_DB"] -> exec_SELECTquery($select,$from,$where,$groupby);

$sql = $GLOBALS["TYPO3_DB"] -> SELECTquery($select,$from,$where,$groupby);

echo $sql;
echo mysql_num_rows($res);
如果我删除类型3中的having子句。查询返回2行,但不是好的一行

如何使用having子句执行此查询


感谢您的帮助

正如文档所述,HAVING关键字后面跟着where条件。()这意味着MySQL将“min(starttime)”表达式解释为where条件,并对min(starttime)的所有非零正值将其求值为1(true)

例如,“HAVING count(*)>10”或“HAVING min(starttime) 所以,把你想要的条件放在拥有之后,你就会得到你想要的一切

为了清楚起见,对于任何感到困惑的人,这里有一个完整的例子:

select uid,starttime,endtime
from table1
where endtime >= UNIX_TIMESTAMP()
Group by uid
having min(starttime) > datediff(now(), interval 1 week);

在本例中,“min(starttime)>datediff(now(),interval 1 week)”是HAVING关键字后面的where条件。

看起来
exec\u SELECTquery()
不支持
HAVING
子句,因此需要使用write-out-In-full

如果您试图为每个具有最短开始时间的用户获取行,正确的查询是:

SELECT uid,starttime,endtime
from table1 t1
JOIN (SELECT uid, min(starttime) minstart
      FROM table1
      where endtime >= UNIX_TIMESTAMP()
      GROUP BY uid) t2
ON t1.uid = t2.uid AND t1.starttime = t2.starttime

您可以使用一个API函数。您应该避免使用nativ mysql函数。如果您使用nativ mysql函数,那么在更新到TYPO3 6.2时,您将在没有警告的情况下遇到麻烦。如果您使用API函数,如果它被弃用,您将得到一个信息。

我认为HAVING子句的作用与您认为的不同。
HAVING
不是
GROUP BY
子句的一部分,它本身是一个单独的子句。我怀疑Type3忽略了您给它的无效
$groupby
值。请尝试
“uid having starttime=min(starttime)”
instead@SudiptaChatterjee这不是为每个uid选择具有最小开始时间的行的正确方法。Te文档清楚地指出,
拥有
位于
分组依据
之后。是,@Barmar,没错。你为什么要指出这一点?因为这意味着你不能把
HAVING
子句放在
$where
中,因为这会把它放在查询中的错误位置。嘿,谁对这个答案投了反对票,谁想说他们对这个答案有什么问题?这样做很有礼貌,让我从错误中吸取教训。@Barmar,我没说要把它放在$where里。where条件跟在HAVING关键字后面。您不应该为此使用本机函数。看看马霍尔茨的答案。@cascaval我的观点是你必须完整地写出这个查询。我不知道Typo3有自己的函数来执行普通的SQL查询。根据maholtz的回答,Typo3似乎并不鼓励使用该函数,或者他们会给它起一个更“正常”的名字。好吧,很公平。你的回答给我的印象是你熟悉打字错误。现在答案看起来更好了+1.