我需要一些关于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语法完成所有操作?
谢谢!
答案 0 :(得分:1)
您可以通过查找行的groupwise maximum来实现此目的。
具体来说,您使用订单作为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 )
above link给出了将其转换为更有效的连接的示例。
答案 1 :(得分: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;
我不确定它的效率如何,但它肯定会得到你的结果。您可以将性能与您找到的其他方式相匹配。