我们有一个即将推出的订购系统,但是,我们需要清除其中一位客户的所有测试数据。由于需要设置的方式,网关部分容纳了多个客户端(即,网关服务于与其对话的几个不同的网站安装)。
在这样做时,我需要最终遍历并删除许多表的数据,但订单是让我绊倒的地方。我们对大多数表都有 client_id,但不是所有的......因此是问题所在。
期待SELECT * FROM orders WHERE client_id = 1001
。然后,对于其中的每一个,我们需要SELECT * FROM order_authorizations WHERE orders.order_id = order_authorizations.order_id
.
到目前为止我正在使用的内容:
SELECT * FROM order_authorizations
WHERE
order_id IN (
SELECT order_id FROM orders
WHERE
order_authorizations.order_id = orders.order_id AND
orders.client_id = 1001
)
;
我不是子查询的天才,也许我做错了,但今天早上我已经浏览了许多其他线程和网站,无论如何,我一直得到“零结果”返回......所以我的方法有些不对劲。有任何想法吗?
带结果的示例查询:
SELECT order_id, client_id FROM `orders` WHERE client_id = 1001 LIMIT 0, 30 ;
Rows: 10
order_id client_id
1237 1001
1236 1001
1235 1001
1234 1001
1233 1001
1232 1001
1231 1001
1230 1001
1229 1001
1228 1001
SELECT order_id
FROM `order_authorizations`
WHERE order_id =1237
LIMIT 0 , 30
MySQL returned an empty result set (i.e. zero rows). ( Query took 0.0001 sec )
问题是,我当然可以看到 order_id 列中有一个匹配 1237 的值。我在 phpMyAdmin 中直观地看到它,但查询显然与我们的测试不匹配。
架构详细信息:
CREATE TABLE IF NOT EXISTS `orders` (
`order_id` int(11) NOT NULL AUTO_INCREMENT,
`client_id` int(11) NOT NULL,
`gateway_id` int(11) NOT NULL,
`customer_id` int(11) DEFAULT '0',
`subscription_id` int(11) NOT NULL,
`card_last_four` varchar(4) NOT NULL,
`amount` varchar(11) NOT NULL,
`coupon_id` int(11) DEFAULT NULL,
`customer_ip_address` varchar(14) DEFAULT NULL,
`status` tinyint(1) NOT NULL DEFAULT '0',
`timestamp` datetime NOT NULL,
`refunded` tinyint(3) NOT NULL,
`refund_date` datetime DEFAULT NULL,
PRIMARY KEY (`order_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1238 ;
CREATE TABLE IF NOT EXISTS `order_authorizations` (
`order_authorization_id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` varchar(200) NOT NULL,
`tran_id` varchar(255) NOT NULL,
`authorization_code` varchar(200) NOT NULL,
`security_key` varchar(200) NOT NULL,
PRIMARY KEY (`order_authorization_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=16 ;