0

我需要一些关于我的 mysql 语法的帮助。

我的表有用户信息,但发货地址和账单地址的订单号相同。

有时人们选择运送到他们的帐单地址;我只需要用户没有输入送货地址的订单号记录,以及他们输入送货地址的位置。

如果他们同时输入账单地址和收货地址,我只需要收货地址,如果这有意义的话。

在表格中,一个订单号有时会出现重复的字段。如果这令人困惑,请查看以下内容:

------------SQL TABLE ----------- 
order_id | address_type | user_name       | address
100      | billto       | Homer Simposn   | 123 Main St.
100      | shipto       | Homer Simpson   | 455 XYZ Ave. 
101      | billto       | Peter Griffin   | 780 111th St.
102      | billto       | Charles Xavier  | 555 Bergen St.
102      | shipto       | Jean Gray       | 555 Bergen St.

我需要输出为:

100 - shipto - Homer Simposn - 455 XYZ Ave. 
101 - billto - Peter Griffin - 780 111th St.
102 - shipto - Jean Gray - 555 Bergen St.

这是我的语法,它只会返回“shipto”记录。

    SELECT * FROM order_info AS A WHERE A.address_type = 'shipto' AND 
NOT EXISTS (SELECT B.address_type 
                    from order_info AS B 
                    where B.address_type = A.address_type 
                    and B.address_type = 'billto')

我想做一些类似IF没有shipto然后返回的事情billto,这可以在sql语法中完成吗?

谢谢!

4

2 回答 2

1

您可以通过为您的行找到分组最大值来实现这一点。

具体来说,您使用顺序作为 ID,并在子查询中查找“最大”地址类型(它会查找shipto它是否存在,billto如果不存在),并使用该结果连接到外部查询中的行。

例如(使用低效的相关子查询):

SELECT * FROM order_info AS A WHERE A.address_type = (
   SELECT MAX(address_type) FROM order_info AS B 
   WHERE A.order_id = B.order_id )

上面的链接给出了一个将其转换为更有效连接的示例。

于 2012-11-21T18:08:55.897 回答
0
select * from test
where address_type = "shipto"
union
select * from test t1
where address_type = "billto"
and (select count(*) from test t2 where t2.order_id = t1.order_id group by order_id) = 1;

我不确定它的效率如何,但它肯定会得到你的结果。您可以将性能与您找到的其他方式相匹配。

于 2012-11-21T18:21:30.697 回答