MySQL两个查询生成一个值

时间:2016-10-02 19:26:58

标签: php mysql date

我需要创建一个从两个不同的表中选择的查询。基本上,我只想从dates表中选择orders表中没有待处理订单的行。

例如,dates表的值为7月1日,7月2日和7月3日。7月2日在status = PEN表中包含orders的订单,因此该表格仅为显示7月1日和7月3日。

dates的查询1:

$sql = "SELECT * FROM dates WHERE DATEDIFF(CURDATE(), date) >= 30 AND `30day`='No'";

我还没有为orders表构建查询,因为我确信这需要一起集成到一个查询中,我不知道该怎么做。

我知道你可以在一个中执行两个SELECT个查询,我知道如何执行此操作,但我不确定如何使第二个SELECT查询受到第一个查询的影响SELECT查询。

dates数据库包含列id date closed 30day 60day

orders数据库包含列id date order status

我需要此查询来标记状态为PEN BO FBO的任何订单。

提前谢谢!

示例数据:

dates表:

Date - 30-day Value

July 1 - No

July 2 - No

July 3 - No

orders表:

Date - Orders - Status

July 1 - 7123456 - PEN

July 1 - 7123457 - SHI

July 1 - 7123487 - SHI

July 2 - 7256789 - SHI

July 2 - 7256790 - SHI

July 2 - 7256791 - SHI

July 3 - 7215368 - SHI

July 3 - 7125369 - SHI

July 3 - 7659876 - BO

July 4 - 7569235 - FBO

July 4 - 7986585 - FBO

预期结果:

Date

July 2

July 3

省略日期:

Date - Reason

July 1 - because there is an open order

July 4 - because there is an open order

我不想要一个省略的表 - 只是想表明什么不会出现。

1 个答案:

答案 0 :(得分:2)

可能是你正在寻找的东西(我不知道你的架构所以对于连接我使用了一个名为key的列

$sql = "SELECT * 
         FROM dates
         LEFT JOIN orders on (dates.date = orders.date  and orders.status not in ('PEN','BO', 'FBO'))
         WHERE DATEDIFF(CURDATE(), dates.date) >= 30 
         AND `30day`='No'";

否则如果你需要那个状态不是PEN,BO和FBO那么你可以

..

$sql = "SELECT * 
        FROM dates 
        LEFT JOIN orders ON  dates.date = orders.date  
        WHERE DATEDIFF(CURDATE(), dates.date) >= 30 
        AND `30day`='No' 
        AND orders.status NOT IN ('PEN','BO', 'FBO'   ) ";

...

$sql = "SELECT * 
        FROM dates 
        INNER JOIN orders ON  dates.date = orders.date  
        WHERE DATEDIFF(CURDATE(), dates.date) >= 30 
        AND `30day`='No' 
        AND orders.status  IN ('PEN','BO', 'FBO'   ) ";

基于提供的示例,这应该返回您需要的行

 $sql = " SELECT * 
          FROM dates 
          WHERE DATEDIFF(CURDATE(), date) >= 30 
          AND `30day`='No' 
          AND date not in ( 
                        select date 
                        from orders 
                        where order.status  IN ('PEN','BO', 'FBO'   ) 
                      ) ";