【问题标题】:MySQL / PHP: Select Where with multiple conditions does not workMySQL / PHP:选择多个条件的地方不起作用
【发布时间】:2015-11-12 14:19:39
【问题描述】:

我有以下数据库条目:

id                date                start_time 
1                 2015-12-25          08:00:00
2                 2015-12-30          08:00:00
3                 2015-12-30          09:00:00             

现在我只想选择同时存在 start_time 条目 08:00:0009:00:00 的条目的日期。

我尝试使用这个 SQL 查询:

$sqlquery = mysqli_query($myconnection,"SELECT date 
                                        FROM mytable 
                                        WHERE start_time LIKE '08:00:00' 
                                        AND '09:00:00'") or die ("crashed");

但它返回了2015-12-252015-12-30 这两个日期。它应该只返回2015-12-30,因为在这个日期08:00:0009:00:00 存在。

我想选择那些也有 08:00:0009:00:00 条目的日期。

它不应该选择只有 08:00:00 条目但没有 09:00:00 条目的日期,也不应该选择那些有 09:00:00 条目但没有 08:00:00 条目的日期。

【问题讨论】:

  • 您是否只想要start_time = '08:00:00' OR start_time = '09:00:00'start_time 中的时间在08:00:00 and 09:00:00 之间的任何日期的行这听起来像是细微差别,但事实并非如此
  • 时间是否总是相同的(即 8:00 和 9:00)?还是您需要查看特定日期的开始时间计数?
  • 好的,我知道我需要解释得更清楚了。我想选择那些也有 08:00:00 和 09:00:00 条目的日期。它不应该选择只有 08:00:00 条目但没有 09:00:00 条目的日期,也不应该选择那些有 09:00:00 条目但没有 08:00:00 条目的日期。
  • 为什么只有08:00:0009:00:00 ??不是08:00:0109:00:02
  • 这不重要@NanaPartykar 我需要对我的进一步代码进行严格的声明。

标签: php mysql sql


【解决方案1】:

不要将like 用于日期/时间列。在这里,你似乎想要between

SELECT date
FROM mytable
WHERE start_time BETWEEN '08:00:00' AND '09:00:00';

您的原始公式解析如下:

WHERE (start_time LIKE '08:00:00') AND '09:00:00'

第二部分是布尔/整数上下文中的字符串值。它被转换为 9,这始终是正确的。因此,where 子句最终等同于:

WHERE start_time = '08:00:00'

编辑:

你的澄清改变了我对这个问题的理解。如果您想要有两个时间的日期,请使用聚合:

SELECT date 
FROM mytable 
WHERE start_time IN ('08:00:00', '09:00:00')
GROUP BY date
HAVING COUNT(*) = 2;

【讨论】:

  • 我认为您通过编写BETWEEN 来假设太多,因为这与问题相去甚远。 (不是我的 dv)
  • @coder 。 . .我误解了最初的问题(我的回答是对你真正想要什么的明智猜测)。 HAVING 的简单聚合应该可以解决您的问题。
【解决方案2】:

我假设您基本上想要选择同时具有“08:00:00”和“09:00:00”的日期,那么您不应该使用“BETWEEN”。 试试这个查询:

SELECT t1.date
FROM mytable AS t1
INNER JOIN mytable AS t2 ON t1.date = t2.date
INNER JOIN mytable AS t3 ON t1.date = t3.date
INNER JOIN mytable AS t4 ON t1.date = t4.date
WHERE t1.start_time = '08:00:00' 
    AND t2.start_time = '09:00:00'
    AND t3.start_time = '10:00:00'
    AND t4.start_time = '11:00:00'
GROUP BY t1.date

或者你可以尝试其他方法

SELECT t1.date
FROM mytable AS t1
GROUP BY t1.date
HAVING SUM(IF(t1.start_time = '08:00:00', 1, 0)) > 0
AND SUM(IF(t1.start_time = '09:00:00', 1, 0)) > 0
AND SUM(IF(t1.start_time = '10:00:00', 1, 0)) > 0
AND SUM(IF(t1.start_time = '11:00:00', 1, 0)) > 0

【讨论】:

  • 除了你可以用=代替LIKE
  • 这很好用!谢谢你。你能告诉我如果我有 5 次代码会是什么样子并且只有那些所有 5 次都被选中的日期吗?比如08:00:00、09:00:00、10:00:00、11:00:00、12:00:00
  • 这正是我在你的问题中警告过的,现在 8:00:00 是硬编码的
  • 是的,由于添加了 start_time 条件,这将是一个长查询:)。我添加了另一种方法
【解决方案3】:

如 cmets 中所述,有不同的方法来实现它,具体取决于您实际想要对结果做什么。

  1. 简单->只计算特定日期的记录

    select date, count(start_time) 
    from mytable 
    group by date 
    having count(start_time) > 1
    

2.Advanced->使用案例显示记录

   select * 
   from (
          Select date,
                case when start_time = '08:00:00' then 1 end as startat8, 
                case when start_time = '09:00:00' then 1 end as startat9 
           from mytable
         ) a 
    where a.startat8=1 and a.startat9=1;

【讨论】:

  • 选项 1 不会查看表中的具体时间,如果有超过 1 个条目,选项 2 将专门查找 8:00 和 9:00,确保时间写入数据库与查询中的完全一样
  • 选项1出错,我更新了答案
  • 很抱歉这两个选项都不起作用。第一个没有结果,当运行第二个时,mysqli 查询终止。
  • 稍等,我将测试选项 2,但您是否在我更新后尝试了选项 1?
  • @Riggsfolly 谢谢,但现在第一种情况的时间不对
猜你喜欢
  • 2014-02-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
相关资源
最近更新 更多