"Combine" 完全外连接而不是内连接?
"Combine" FULL OUTER JOIN and NOT IN?
我有两个 table:
+-----------------------+
| 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。取下后,orderTakentable会记录userId、orderId,并初始设置orderStatus = 1,店铺根据不同情况更新orderStatus。一旦商店更新了 isClosed = 1 那么无论用户是否接受它都不会显示该订单(没有意义,但它只是查询中的 isClosed == 0)。
现在,我想构建一个网页,将显示用户尚未接受的新订单(这应该是其orderIds未记录在orderTaken table下的订单)此用户的 userId),以及用户已经使用显示的 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
从那时起,返回的table将消除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;
此查询有效,但在返回的 table 中没有来自 orderTaken B 的字段 orderStatus。我想在此查询之后添加另一个 JOIN orderTaken B 子句以从 B 获取字段,但我认为这不是编写查询的好方法。
我只是想结合 "NOT IN" 和 "FULL JOIN"。有人可以帮帮我吗?谢谢!
您似乎想在 orders
中查找未分配给用户的记录( 即 在 orderTaken
中没有相关记录) 加上分配给用户的那些,但 orderStatus 不是 4 或 5。
则不需要完全外部联接,因为 orderTaken
中将没有记录,而 orders
中没有相关记录。 Left inner join
可用于查找来自 orders
的所有记录,on
子句将包含来自 orderTaken
的相关记录的数据,而 where
子句可以然后过滤掉其他用户接受的订单,或者 orderStatus 为 4 或 5 的地方:
SELECT o.*, ot.userID, ot.orderStatus
FROM orders o
LEFT JOIN orderTaken ot
ON ot.orderID = o.orderID
WHERE o.isClosed = 0
AND (ot.userID IS NULL OR ot.userID = $userID AND ot.orderStatus NOT IN (4,5))
ORDER BY o.creationTime DESC
正如@terje-d所说,你需要的是LEFT JOIN
。使用原始 table 名称更新它并修复了 $userId
过滤器。
- 对于所有未完成的订单和未完成的订单。
SELECT o.`orderId`,
o.`orderName`,
ot.`orderStatus`,
o.`orderCreationTime`
FROM orders o
LEFT JOIN orderTaken ot
ON o.orderId = ot.orderId
WHERE o.isClosed = 0
AND (
ot.orderId IS NULL
OR ot.orderStatus NOT IN (4,5)
)
ORDER BY o.`orderCreationTime` DESC
- 针对特定用户的所有未结订单和未完成订单
SELECT o.`orderId`,
o.`orderName`,
ot.`orderStatus`,
o.`orderCreationTime`
FROM orders o
LEFT JOIN orderTaken ot
ON o.orderId = ot.orderId
WHERE o.isClosed = 0
AND ( ot.orderStatus IS NULL
OR (
ot.user_id = ?
AND ot.orderStatus NOT IN (4,5)
)
)
ORDER BY o.`orderCreationTime` DESC
我有两个 table:
+-----------------------+
| 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。取下后,orderTakentable会记录userId、orderId,并初始设置orderStatus = 1,店铺根据不同情况更新orderStatus。一旦商店更新了 isClosed = 1 那么无论用户是否接受它都不会显示该订单(没有意义,但它只是查询中的 isClosed == 0)。
现在,我想构建一个网页,将显示用户尚未接受的新订单(这应该是其orderIds未记录在orderTaken table下的订单)此用户的 userId),以及用户已经使用显示的 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
从那时起,返回的table将消除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;
此查询有效,但在返回的 table 中没有来自 orderTaken B 的字段 orderStatus。我想在此查询之后添加另一个 JOIN orderTaken B 子句以从 B 获取字段,但我认为这不是编写查询的好方法。
我只是想结合 "NOT IN" 和 "FULL JOIN"。有人可以帮帮我吗?谢谢!
您似乎想在 orders
中查找未分配给用户的记录( 即 在 orderTaken
中没有相关记录) 加上分配给用户的那些,但 orderStatus 不是 4 或 5。
则不需要完全外部联接,因为 orderTaken
中将没有记录,而 orders
中没有相关记录。 Left inner join
可用于查找来自 orders
的所有记录,on
子句将包含来自 orderTaken
的相关记录的数据,而 where
子句可以然后过滤掉其他用户接受的订单,或者 orderStatus 为 4 或 5 的地方:
SELECT o.*, ot.userID, ot.orderStatus
FROM orders o
LEFT JOIN orderTaken ot
ON ot.orderID = o.orderID
WHERE o.isClosed = 0
AND (ot.userID IS NULL OR ot.userID = $userID AND ot.orderStatus NOT IN (4,5))
ORDER BY o.creationTime DESC
正如@terje-d所说,你需要的是LEFT JOIN
。使用原始 table 名称更新它并修复了 $userId
过滤器。
- 对于所有未完成的订单和未完成的订单。
SELECT o.`orderId`,
o.`orderName`,
ot.`orderStatus`,
o.`orderCreationTime`
FROM orders o
LEFT JOIN orderTaken ot
ON o.orderId = ot.orderId
WHERE o.isClosed = 0
AND (
ot.orderId IS NULL
OR ot.orderStatus NOT IN (4,5)
)
ORDER BY o.`orderCreationTime` DESC
- 针对特定用户的所有未结订单和未完成订单
SELECT o.`orderId`,
o.`orderName`,
ot.`orderStatus`,
o.`orderCreationTime`
FROM orders o
LEFT JOIN orderTaken ot
ON o.orderId = ot.orderId
WHERE o.isClosed = 0
AND ( ot.orderStatus IS NULL
OR (
ot.user_id = ?
AND ot.orderStatus NOT IN (4,5)
)
)
ORDER BY o.`orderCreationTime` DESC