【发布时间】:2018-04-14 23:42:05
【问题描述】:
我有一个order 表,它与两个连接表相关联:order_buyer 和order_seller。
表结构如下:
CREATE TABLE IF NOT EXISTS `order` (
id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
-- some fields...
created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS order_seller (
id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
order_id INT(10) UNSIGNED NOT NULL,
seller_id INT(10) UNSIGNED NOT NULL,
created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
CONSTRAINT fk_order_seller_order_id FOREIGN KEY (order_id) REFERENCES `order` (id) ON DELETE CASCADE,
CONSTRAINT fk_order_seller_seller_id FOREIGN KEY (seller_id) REFERENCES user (id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS order_buyer (
id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
order_id INT(10) UNSIGNED NOT NULL,
buyer_id INT(10) UNSIGNED NOT NULL,
created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
CONSTRAINT fk_order_buyer_order_id FOREIGN KEY (order_id) REFERENCES `order` (id) ON DELETE CASCADE,
CONSTRAINT fk_order_buyer_buyer_id FOREIGN KEY (buyer_id) REFERENCES user (id) ON DELETE CASCADE
);
如果我是查看我的订单历史记录的买家,我希望获得所有 order_buyer.buyer_id 等于我的用户 ID 的订单。卖家也是如此。
但是我的查询是这样的,我不知道是买方还是卖方提出了查询;我只有一个用户ID。所以我需要其中一个来匹配,如果一个匹配,那么我想收集那个订单。
以下查询不起作用,因为它给了我每一个订单:
SELECT `order`.*
FROM `order`
LEFT JOIN order_seller
ON order_seller.seller_id = 1
AND order_seller.order_id = order.id
LEFT JOIN order_buyer
ON order_buyer.buyer_id = 1
AND order_buyer.order_id = order.id
WHERE order.status = "PENDING"
下面的查询通过从连接中删除AND 并使其成为结果集上的WHERE IN 子句来解决上述问题:
SELECT `order`.*
FROM `order`
LEFT JOIN order_seller
ON order_seller.seller_id = 1
LEFT JOIN order_buyer
ON order_buyer.buyer_id = 1
WHERE order.status = "PENDING"
AND order.id IN (order_buyer.order_id, order_seller.order_id)
我的问题是,是否有更好的查询来实现相同的目标?这对我来说似乎有点肮脏。感觉不自然。
【问题讨论】:
-
qq:为什么有group by却没有聚合功能?其次;你能把样本数据和你的预期结果放在一起吗?没有样本就很难分析数据。
-
对不起,group by 是我正在做的其他事情的产物。删除了那个。将使用测试数据进行更新。