我需要创建一个从两个不同的表中选择的查询。基本上,我只想从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
我不想要一个省略的表 - 只是想表明什么不会出现。
答案 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' )
) ";