选择具有特定位置的最小值MYSQL

时间:2015-05-11 21:39:57

标签: php mysql sql-server where-clause min

我的子查询有点麻烦。我尝试仅在具有最小值的表中获取最近的事件,但我需要确认它(确认= 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是当前小时的PHP日期(H:i)和$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

它不关心确认= 1的where语句,但它关心if(关闭>'$ now'AND date ='$ today')或(date>'$ today'),1 ,0因为它返回第二个。

有人可以给我一些帮助吗?

P.S。:一切都在MySQL

谢谢。

- 卡洛斯

编辑:::

我只是想在select(SELECT *,MIN(date))

中添加一些值

然后它返回我的不对称数据???

我得到了

| 4  | aaa  | 2015-05-16 | 09:00 | 16:00 | 1 | 2015-05-12

所以第一个日期是好日期,第二个日期(min())不是好日子。

最后编辑:::

AS建议spencer7593(感谢他/她),我刚刚删除了min(日期),它会自动返回我想要的数据,好的sql是:

SELECT *
FROM  table
WHERE confirmed = 1
AND IF (
    (close > '$now' AND date = '$today') OR (date> '$today'), 1, 0
)
GROUP By location

3 个答案:

答案 0 :(得分:0)

试试这样:

SELECT location, MIN(date)
FROM  table
WHERE confirmed = 1
AND ((close > '$now' AND date = '$today') OR (date> '$today'))
GROUP By location

也许If语句会导致行为错误。

答案 1 :(得分:0)

鉴于示例数据,它看起来不应该返回2015-05-12的日期值。

我质疑列的数据类型是什么,特别是 confirmed 列。如果该列是 CHAR VARCHAR ,那么比较可能是作为字符而不是数字进行的,而且还有一些隐藏的角色让它变得不平等。

如果是这种情况,以及它在列值中的尾随字符,您可以尝试通过在语句中添加零来将confirmed强制转换为数字,例如

WHERE confirmed+0 = 1

将在数字上下文中评估表达式confirmed+0

我还怀疑dateclose列的数据类型,如果那些也是VARCHAR或CHAR ...虽然这不能解释为什么谓词在confirmed被忽略了。

我们只是猜测,没有足够的信息来真实地告诉我们发生了什么。

为了调试此类问题,echovardump SQL文本发送到数据库之前,您可以看到实际发送的内容。

  $sql = "SELECT ....   " . $var . " ... ORDER BY 1";
  echo $sql;  # for debugging

  $dbh->query($sql);

我将那些发出的SQL文本带到另一个客户端进行测试。我尝试删除MIN聚合函数和GROUP BY,并返回行中的所有相关列,以查看正在分组的实际行。

答案 2 :(得分:0)

假设您在提供的日期和时间之后尝试从第一个确认的记录中找到该位置。

SELECT `location`, `date`
FROM `table`
WHERE `confirmed` = 1 
   AND (`date` > '$today'
         OR (`date` = '$today' AND `close` > '$now')
       )
ORDER BY `date`, `close`
LIMIT 1
;