我有两个表:“合并”完全外部连接而不是?
+-----------------------+
| Tables_in_my_database |
+-----------------------+
| orders |
| orderTaken |
+-----------------------+
在订单中,有属性
orderId, orderName, isClosed and orderCreationTime.
在orderTaken,有属性
userId, orderId and orderStatus.
比方说,当
orderStatus = 1 --> the customer has taken the order
orderStatus = 2 --> the order has been shipped
orderStatus = 3 --> the order is completed
orderStatus = 4 --> the order is canceled
orderStatus = 5 --> the order has an exception
基本上我的项目运行机制是这样的:具有唯一userId的用户将能够从网页接收订单,其中每个订单也具有其自己的唯一orderId。采取后,orderTaken表将记录userId,orderId并初始设置orderStatus = 1.然后,商店根据各种情况更新orderStatus。一旦商店更新了isClosed = 1,那么无论用户采用或不采用该顺序都不会显示(没有意义,但它只是查询中的isClosed == 0)。
现在,我想构建一个网页,将显示用户还没有采取的新订单(应该是orderIds没有记录在该用户的userId下的orderTaken表中的订单),以及用户已经使用orderStatus显示的顺序,但是orderStatus不是4或5,按orderCreationTime DESC组合(如果我没有OrderTakenTime但是让我们保持这种方式,也许没有意义),就像:
OrderId 4
Order Name: PetPikachu
orderStatus = 1
CreationTime: 5am
OrderId 3
Order Name: A truck of hamsters
orderStatus = 3
CreationTime: 4am
OrderId 2
New order
Order Name: Macbuk bull
CreationTime: 3am
OrderId 1
Order Name: Jay Chou's Album
orderStatus = 2
CreationTime: 2am
我已经基于这样的认识,我得知这个查询写:
SELECT * FROM orders A WHERE A.isClosed == '0' FULL OUTER JOIN orderTaken B WHERE B.userId = '4' AND (B.orderStatus<>'4' OR B.orderStatus<>'5') ORDER BY A.orderCreationTime DESC;
显然,这查询不工作,但恐怕有
ON A.orderId = B.orderId
自此之后返回将消除将订单还没有被记录在orderTaken B.我的新订单”表以前也尝试了NOT IN子句像
SELECT * FROM orders A WHERE A.isClosed = '0' AND A.orderId NOT IN (SELECT orderId FROM orderTaken B WHERE B.userId = '$userId' AND (B.orderStatus='4' OR B.orderStatus='5')) ORDER BY creationTime DESC;
这个查询的作品,但它不会在返回的表有场orderStatus从orderTaken B中。我想在此查询后添加另一个JOIN orderTaken B子句以从B中获取字段,但我认为这不是写好查询的好方法。
我只是想结合“不在”和“全加入”。有人可以帮我吗?谢谢!
谢谢泰耶!这正是我想要的!我正在考虑使用LEFT JOIN,但我只是不知道“IS NULL”子句。这是我从你那里学到的关键。再次感谢您解决我的问题! :D – Hang
我现在更正了表名(orderTaken,拼写为orderStatus)。 –
这使得它更加精确。再次感谢Terje! – Hang