【问题标题】:MYSQL Using AND and OR on selecting data from databaseMYSQL 使用 AND 和 OR 从数据库中选择数据
【发布时间】:2016-10-09 05:46:34
【问题描述】:

我想从这个表中选择 * 数据只是为了根据我选择的过滤器显示所有内容。

我的桌子:

tbl_reservation

res_id | trans_code |   status | order_type   |    type_of_order  | date_ordered
------ | -----------|----------|--------------|-------------------|-------------
  1    |   111-111  |Delivered | For Delivery | Online Transaction|2016-10-09
------ | -----------|----------|--------------|-------------------|-------------
  2    |   111-112  |Delivered | For Pick-up  | Online Transaction|2016-10-09
------ | -----------|----------|--------------|-------------------|-------------
  3    |   111-113  |Cancelled | For Delivery | Online Transaction|2016-10-09
------ | -----------|----------|--------------|-------------------|-------------
  4    |   111-114  |          | For Purchase | Online Transaction|2016-10-09
------ | -----------|----------|--------------|-------------------|-------------
  5    |   111-115  |          | For Pick-up  | Walkin Transaction|2016-10-09
------ | -----------|----------|--------------|-------------------|-------------
  6    |   111-116  |          | For Purchase | Walkin Transaction|2016-10-09
------ | -----------|----------|--------------|-------------------|-------------
  7    |   111-117  |Delivered | For Pick-up  | Walin Transaction |2016-10-09
------ | -----------|----------|--------------|-------------------|-------------
  8    |   111-118  |Delivered | For Delivery | Online Transaction|2016-10-08
------ | -----------|----------|--------------|-------------------|-------------
  9    |   111-119  |Delivered | For Pick-up  | Online Transaction|2016-10-08
------ | -----------|----------|--------------|-------------------|-------------
 10    |   111-110  |Cancelled | For Delivery | Online Transaction|2016-10-08
------ | -----------|----------|--------------|-------------------|-------------
 11    |   111-100  |          | For Purchase | Online Transaction|2016-10-08
------ | -----------|----------|--------------|-------------------|-------------
 12    |   111-101  |          | For Pick-up  | Walkin Transaction|2016-10-08
------ | -----------|----------|--------------|-------------------|-------------
 13    |   111-102  |          | For Purchase | Walkin Transaction|2016-10-08
------ | -----------|----------|--------------|-------------------|-------------
 14    |   111-103  |Delivered | For Pick-up  | Walin Transaction |2016-10-08

我的表格:

<form method="post" action="">
<select name="filter">
<option value="Today">Filter Data for today</option>
<option value="Yesterday">Filter Data for yesterday</option>
</select>
<input type="submit" value="Filter"/>
</form>

我的 PHP 代码和关于获取过滤器的示例查询

<?php
//inclue db connection

if(isset($_POST["filter"])){
$get_filter = $_POST["filter"];
if($filter == "Today"){
  $sql = mysql_query("SELECT * FROM tbl_reservation WHERE status = 'Delivered' OR status = 'Cancelled' OR status = '' AND DATE(date_ordered) = DATE(now()) ");
}elseif($filter == "Yesterday"){
  $sql = mysql_query("SELECT * FROM tbl_reservation WHERE status = 'Delivered' OR status = 'Cancelled' OR status = '' AND DATE(date_ordered) = DATE(now())-1 ");
}


//THEN DISPLAY ALL IN VARIABLE USING WHILE LOOP AS mysql_fetch_array
//Display data here
//..
//..
//..
?>

日期顺序 = 2016-10-09 [今天]
订单日期 = 2016-10-08 [昨天]
没有错误。
当我选择今天的过滤时..它会显示所有数据以及昨天的数据
但是当我选择昨天时..它会显示所有数据以及今天的数据

我希望更正数据查询。有人可以帮忙吗?谢谢。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    当您从日期中减去 1 时,它不会产生您想要的效果:MySql 然后将日期转换为数字并从中减去 1。这不会在月初给出预期的结果。

    所以使用date_adddate_sub 而不是-1,例如:

    date_sub(date(now()), interval 1 day)
    

    其次,逻辑运算符and 优先于or,所以当你这样写时:

    WHERE status = 'Delivered' 
       OR status = 'Cancelled' 
       OR status = '' 
      AND date(date_ordered) = date(now())
    

    评估为:

    WHERE status = 'Delivered' 
       OR status = 'Cancelled' 
       OR (status = '' AND date(date_ordered) = date(now()))
    

    ...这意味着当该状态为已交付或已取消时,日期条件不起作用。

    您可以通过在OR 部分周围添加括号来解决此问题,或者您可以从IN 运算符中受益:

    WHERE status IN ('Delivered', 'Cancelled', '')
      AND date(date_ordered) = date(now()))
    

    .. 对于第二条 SQL 语句:

    WHERE status IN ('Delivered', 'Cancelled', '')
      AND date(date_ordered) = date_sub(date(now()), interval 1 day)
    

    【讨论】:

    • 感谢您提供的信息,先生。您关于使用 IN 的声明让我对查询语句有了另一种了解。很好的解释。
    【解决方案2】:

    这行得通吗?

    SELECT * FROM tbl_reservation WHERE DATE(date_ordered) = DATE(now()) AND (status = 'Delivered' OR status = 'Cancelled' OR status = '')
    

    【讨论】:

    • 还没有尝试过这个.. 但我会尝试为此调试我的代码.. 希望它有效.. 手指交叉.. 哈哈哈
    • 它有效.. 我不知道你可以为状态加上括号.. 非常感谢..
    【解决方案3】:

    你应该使用 date_sub

      SELECT * 
      FROM tbl_reservation 
      WHERE status = 'Delivered' 
      OR status = 'Cancelled' 
      OR status = '' 
      AND DATE(date_ordered) = DATE_SUB(now(),INTERVAL 1 DAY)
    

    也可能是状态为空(不是='')

      SELECT * 
      FROM tbl_reservation 
      WHERE status = 'Delivered' 
      OR status = 'Cancelled' 
      OR status  is null 
      AND DATE(date_ordered) = DATE_SUB(now(),INTERVAL 1 DAY)
    

    【讨论】:

    • 我已经尝试使用 DATE(date_ordered) = DATE(now()) 并且它仍然适用于我先生.. 但是当我添加 OR 语句来选择状态时,.. 我认为它与mysql语句
    • 可能是状态为空。我已经更新了答案
    • 是的,先生。谢谢你。我已经调试了我的代码并尝试了 +Boris Savic 的代码。我不知道你可以用 () 将状态括起来并用 AND 运算符分隔它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 2019-02-11
    • 2020-01-08
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    相关资源
    最近更新 更多