【问题标题】:Two records that have same data cell value in one field but different in another, query to return only one based on criteria一个字段中具有相同数据单元格值但在另一个字段中具有不同数据单元格值的两条记录,根据条件查询以仅返回一个
【发布时间】:2012-11-10 01:23:49
【问题描述】:

我需要一些关于我的 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语法中完成吗?

谢谢!

【问题讨论】:

    标签: mysql syntax duplicate-data not-exists


    【解决方案1】:
    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;
    

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

    【讨论】:

    • 大声笑..不用担心..无论如何,我使用 3 个查询,这将比 2 个慢:P
    【解决方案2】:

    您可以通过为您的行找到 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 给出了一个将其转换为更有效连接的示例。

    【讨论】:

    • 那是非常有创意的......我会记得从现在开始看事情......谢谢:)
    • 好的,谢谢您的回答。我仍然需要一点帮助来理解你的意思。我使用了SELECT * FROM jos_vm_order_user_info A WHERE order_id=(SELECT MAX(B.order_id) FROM jos_vm_order_user_info B WHERE A.address_type = B.address_type),但它只返回2条记录,其中最大订单号为billtoship to。喜欢记录号101 - billto - Peter Griffin - 780 111th St. 和 102 - shipto - Jean Gray - 555 Bergen St.`
    • 你需要反过来做——加入order_id并选择最大的address_type。复制我的答案中的查询并将order_info替换为jos_vm_order_user_info,看看是否可行。
    猜你喜欢
    • 1970-01-01
    • 2012-01-22
    • 2019-05-21
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多