У меня есть две таблицы:
+-----------------------+
| 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
В основном механизм моего проекта работает следующим образом: пользователь с уникальным идентификатором пользователя сможет принять заказ с веб-страницы, где каждый заказ также имеет свой уникальный идентификатор заказа. После взятия таблица orderTaken запишет userId, orderId и первоначально установит orderStatus = 1. Затем магазин обновит orderStatus в зависимости от различных ситуаций. Как только магазин обновил isClosed = 1, этот заказ вообще не будет отображаться, независимо от того, взял его пользователь или нет (не имеет смысла, но это просто isClosed == 0 в запросе).
Теперь я хочу создать веб-страницу, которая будет отображать как новые заказы, которые пользователь еще не принял (это должны быть заказы, идентификаторы которых не записаны в таблице 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
с тех пор возвращенная таблица устранит новые заказы, для которых 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, но я думаю, что это не лучший способ написать запрос.
Я просто хочу объединить "НЕ В" и "ПОЛНОЕ СОЕДИНЕНИЕ". Кто-нибудь может мне помочь? Спасибо!