这是我的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);
如果我删除了typo3中的having子句。查询返回2行但不是好行。
如何使用having子句执行此查询?
感谢您的帮助
答案 0 :(得分:1)
看起来exec_SELECTquery()
不支持HAVING
子句,因此您需要使用完全写出查询。
如果您尝试为每个具有最短开始时间的用户获取行,则正确的查询为:
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
答案 1 :(得分:1)
您可以使用$GLOBALS['TYPO3_DB'] -> sql_query()这是一个API函数。你应该避免使用nativ mysql函数。如果您使用nativ mysql函数,在更新到TYPO3 6.2时会遇到麻烦而不会发出警告。如果您使用API函数,那么如果不推荐使用它,您将获得一个Info。
答案 2 :(得分:-1)
正如文档所说,HAVING关键字后跟where条件。 (http://dev.mysql.com/doc/refman/5.0/en/select.html)这意味着MySQL将你的“min(starttime)”表达式解释为where条件,并将所有非零正值min(starttime)的值评估为1(真)。
例如,“HAVING count(*)> 10”或“HAVING min(starttime)< now()”或任何在条件更有趣的地方。
所以,在HAVING之后放置你想要的条件,你会得到你想要的任何东西。
请注意,对于任何困惑的人来说,这是一个完整的例子:
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条件。