【问题标题】:MySQL "Or" ConditionMySQL“或”条件
【发布时间】:2012-01-26 02:59:06
【问题描述】:

查看这个MySQL 查询,然后我会告诉你我真正想要它做什么......

mysql_query("
SELECT * FROM Drinks WHERE
    email='$Email'
    AND date='$Date_Today'
    OR date='$Date_Yesterday'
    OR date='$Date_TwoDaysAgo'
    OR date='$Date_ThreeDaysAgo'
    OR date='$Date_FourDaysAgo'
    OR date='$Date_FiveDaysAgo'
    OR date='$Date_SixDaysAgo'
    OR date='$Date_SevenDaysAgo'");

它的问题是我希望它始终与电子邮件匹配。在这种情况下(例如)如果日期等于$Date_SixDaysAgo,那么即使$Email 不等于电子邮件列,也会从查询中选择它。

所以,简而言之,我希望电子邮件始终等于电子邮件列,如果查询提取的日期等于 $Daye_TwoDaysAgo$Date_ThreeDaysAgo 等。但不等于电子邮件,则不要拉它。

我想我的查询看起来像这样,但我很确定它不会工作..

mysql_query("
    SELECT * FROM Drinks WHERE
    email='$Email'
    AND date='$Date_Today
    || $Date_Yesterday
    || $Date_TwoDaysAgo
    || $Date_ThreeDaysAgo
    || $Date_FourDaysAgo
    || $Date_FiveDaysAgo
    || $Date_SixDaysAgo
    || $Date_SevenDaysAgo'");

【问题讨论】:

    标签: php mysql select conditional-statements


    【解决方案1】:

    使用括号对 OR 语句进行分组。

    mysql_query("SELECT * FROM Drinks WHERE email='$Email' AND (date='$Date_Today' OR date='$Date_Yesterday' OR date='$Date_TwoDaysAgo' OR date='$Date_ThreeDaysAgo' OR date='$Date_FourDaysAgo' OR date='$Date_FiveDaysAgo' OR date='$Date_SixDaysAgo' OR date='$Date_SevenDaysAgo')");
    

    你也可以使用IN

    mysql_query("SELECT * FROM Drinks WHERE email='$Email' AND date IN ('$Date_Today','$Date_Yesterday','$Date_TwoDaysAgo','$Date_ThreeDaysAgo','$Date_FourDaysAgo','$Date_FiveDaysAgo','$Date_SixDaysAgo','$Date_SevenDaysAgo')");
    

    【讨论】:

      【解决方案2】:

      使用括号:

      mysql_query("SELECT * FROM Drinks WHERE email='$Email' AND 
          (date='$Date_Today' 
           OR date='$Date_Yesterday' 
           OR date='$Date_TwoDaysAgo' 
           OR date='$Date_ThreeDaysAgo' 
           OR date='$Date_FourDaysAgo' 
           OR date='$Date_FiveDaysAgo' 
           OR date='$Date_SixDaysAgo' 
           OR date='$Date_SevenDaysAgo'
          )
      ");
      

      但你也应该看看IN 运算符。所以你可以说'date IN ('$date1','$date2',...)`

      但是,如果您总是有一组连续的日子,为什么不为日期部分执行以下操作

      date <= $Date_Today AND date >= $Date_SevenDaysAgo
      

      【讨论】:

      • 或者可能使用 BETWEEN 运算符。
      【解决方案3】:

      您的问题是关于 mysql 中的 operator precedencesAlex has shown you 如何用括号“覆盖”优先级。

      但附带说明一下,如果您的列 dateDate 类型,您可以使用 MySQL's date and time functions 获取过去 7 天的记录,例如

      SELECT
        *
      FROM
        Drinks
      WHERE
        email='$Email'
        AND date >= Now()-Interval 7 day
      

      (或者可能是 Curdate() 而不是 Now())

      【讨论】:

        【解决方案4】:

        将你的 AND 逻辑用括号括起来,如下所示:

        mysql_query("SELECT * FROM Drinks WHERE email='$Email' AND (date='$Date_Today' OR date='$Date_Yesterday' OR date='$Date_TwoDaysAgo' OR date='$Date_ThreeDaysAgo' OR date='$Date_FourDaysAgo' OR date='$Date_FiveDaysAgo' OR date='$Date_SixDaysAgo' OR date='$Date_SevenDaysAgo')");
        

        【讨论】:

          【解决方案5】:

          试试这个

          mysql_query("
          SELECT * FROM Drinks WHERE
              email='$Email'
              AND date='$Date_Today'
              OR date='$Date_Yesterday', '$Date_TwoDaysAgo', '$Date_ThreeDaysAgo', '$Date_FourDaysAgo', '$Date_FiveDaysAgo', '$Date_SixDaysAgo', '$Date_SevenDaysAgo'"     
             );
          

          我是这样的

           OR date='$Date_Yesterday' oR '$Date_TwoDaysAgo'.........
          

          【讨论】:

          • 您是否考虑过删除此答案?你会找回失去的声誉。
          猜你喜欢
          • 1970-01-01
          • 2014-04-14
          • 1970-01-01
          • 1970-01-01
          • 2015-08-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多