Php 选择具有特定位置过滤器的最小值

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 |

我的子查询有点问题。我尝试只获取表中具有最小值的最近事件,但我需要将其确认为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        |
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最近的记录,但它是真的,在我的示例中可能会混淆,因为它只有一个位置