Php 选择具有特定位置过滤器的最小值
我的子查询有点问题。我尝试只获取表中具有最小值的最近事件,但我需要将其确认为confirm=1,取消为0 这是我的桌子:Php 选择具有特定位置过滤器的最小值,php,mysql,sql-server,where-clause,min,Php,Mysql,Sql Server,Where Clause,Min,我的子查询有点问题。我尝试只获取表中具有最小值的最近事件,但我需要将其确认为confirm=1,取消为0 这是我的桌子: uid | location | date | open | close | confirmed | 1 | aaa | 2015-05-11 | 12:00 | 14:30 | 1 | 2 | aaa | 2015-05-12 | 15:00 | 22:30 | 0 |
uid | location | date | open | close | confirmed |
1 | aaa | 2015-05-11 | 12:00 | 14:30 | 1 |
2 | aaa | 2015-05-12 | 15:00 | 22:30 | 0 |
3 | aaa | 2015-05-15 | 11:00 | 18:30 | 0 |
4 | aaa | 2015-05-16 | 09:00 | 16:00 | 1 |
这是我的查询:$now是当前小时H:i的php日期,$today是格式为Y-m-d的php日期
SELECT location, MIN(date)
FROM table
WHERE confirmed = 1
AND IF (
(close > '$now' AND date = '$today') OR (date> '$today'), 1, 0
)
GROUP By location
因此,在测试格式中,我们是5月11日17:00。第一个不应该被选择,因为它发生在今天早上的过去,第二个也不应该被选择,因为我将确认设置为0
预期的结果是
aaa | 2015-05-16
因为它与确认最接近
但它总是会回报我
aaa | 2015-05-12
它不关心confirm=1的where语句,但它关心的是if close>'$now'和date='$today'或date>'$today',1,0,因为它返回第二个语句
有人能帮我吗
附言:都在MySQL中
多谢各位
-卡洛斯
编辑:::
我只是想在select*,MINdate中添加一些值
它会给我返回不对称数据
我得到
| 4 | aaa | 2015-05-16 | 09:00 | 16:00 | 1 | 2015-05-12
所以第一次约会是好的,第二次和min约会不是好的
上次编辑:::
正如spencer7593所建议的,感谢他/她,我刚刚删除了mindate,它会自动返回我想要的数据,好的sql是:
SELECT *
FROM table
WHERE confirmed = 1
AND IF (
(close > '$now' AND date = '$today') OR (date> '$today'), 1, 0
)
GROUP By location
试着这样做:
SELECT location, MIN(date)
FROM table
WHERE confirmed = 1
AND ((close > '$now' AND date = '$today') OR (date> '$today'))
GROUP By location
可能If语句使行为错误。给定示例数据,它显然不应该返回2015-05-12的日期值 我在质疑列的数据类型是什么,特别是确认列。如果该列是CHAR或VARCHAR,则比较可能是以字符而不是数字形式进行的,并且有一些隐藏字符使其不相等 如果是这种情况,并且列值中有尾随字符,您可以尝试通过在语句中添加零将确认转换为数值,例如
WHERE confirmed+0 = 1
表达式+0将在数值上下文中计算
我还怀疑date和close列的数据类型,若它们也是VARCHAR或CHAR。。。尽管这不能解释为什么会忽略confirm上的谓词
我们只是猜测,没有足够的信息来真正说明发生了什么
要调试此类问题,请在将SQL文本发送到数据库之前回显或vardump,以便查看实际发送的内容
$sql = "SELECT .... " . $var . " ... ORDER BY 1";
echo $sql; # for debugging
$dbh->query($sql);
我将获取发出的SQL文本,并在另一个客户机中进行测试。我将尝试删除MIN aggregate函数和GROUP BY,并返回行中的所有相关列,以查看正在分组的实际行。假设您试图从提供的日期和时间之后的第一条确认记录中查找位置
SELECT `location`, `date`
FROM `table`
WHERE `confirmed` = 1
AND (`date` > '$today'
OR (`date` = '$today' AND `close` > '$now')
)
ORDER BY `date`, `close`
LIMIT 1
;
说清楚。您正在尝试从提供的日期和时间之后的第一个确认记录中查找位置?所有内容在午夜之前关闭?是的,所有内容在午夜之前关闭,在凌晨2点之后打开。我希望未来的事件,为每个地点与组由我的数据库有很多的地点和所有的事件。我需要下一个确认的oneEDIT:::删除聚合函数MIN和groupby子句,作为测试,正如我在回答中建议的那样。其他RDBMS会在编辑中显示的语句中抛出错误。选择列表中的非聚合不在分组依据中。非标准的MySQL扩展允许这种行为,即返回不对称数据,因为为非聚合列返回的值是不确定的。MySQL可以自由地从满足谓词的任何行返回非聚合列的值。@spencer7593-哇,它真的可以工作!!我移除了mindate,但不是group by,因为我需要它来获得更多的位置,它给了我正确的答案。非常感谢。我无法选择您的答案,因为这是我帖子中的一条评论,我已尝试删除它。这不会改变任何事情。它不听。我的if语句有效。我知道有什么问题,请尝试使用having语句。这是分组依据的位置。选择位置,MINdate FROM table group by location have confirm=1并关闭>“$now”和日期=“$today”或日期>“$today”confirm是一个0或1的小布尔值,日期、打开和关闭是varchar@Carlos2W:您是否确定没有位置为'aaa'的行,datecharacter='2015-05-12'并确认=1?我会在不使用聚合的情况下对表运行查询,并删除GROUP BY和AGGRATE函数。标准模式是对日期值使用日期数据类型,对时间值使用时间数据类型,而不是VARCHAR。。。但这并不能解释您在确认列上看到的谓词行为。是的,因为我刚刚创建了一个新表,其中只有这四行要测试,它给出了相同的结果。您能创建一个SQLFIDLE来复制此行为吗?很奇怪。你确定你是伦尼吗
是否针对为测试创建的新表取消查询?您对任何行所做的任何更新或删除更改是否尚未提交?否,因为还有其他位置,我想要一个位置列表,其中包含与group by最近的记录,但它是真的,在我的示例中可能会混淆,因为它只有一个位置