两个记录在一个字段中具有相同的数据单元格值但在另一个字段中具有不同,查询仅根据条件返回一个

时间:2012-11-21 17:58:15

标签: mysql syntax duplicate-data not-exists

我需要一些关于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语法完成所有操作?

谢谢!

2 个答案:

答案 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;

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