0

我们有一个即将推出的订购系统,但是,我们需要清除其中一位客户的所有测试数据。由于需要设置的方式,网关部分容纳了多个客户端(即,网关服务于与其对话的几个不同的网站安装)。

在这样做时,我需要最终遍历并删除许多表的数据,但订单是让我绊倒的地方。我们对大多数表都有 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 ;
4

1 回答 1

1

您可以进一步将其转换为JOIN,

SELECT  DISTINCT a.*
FROM    order_authorizations a
        INNER JOIN orders b
            ON a.order_id = b.order_id 
WHERE   b.client_id = 1001

要进一步了解有关联接的更多信息,请访问以下链接:


这是DELETE声明,

DELETE  a
FROM    order_authorizations a
        INNER JOIN orders b
            ON a.order_id = b.order_id 
WHERE   b.client_id = 1001
于 2013-04-18T16:37:35.850 回答