为了账号安全,请及时绑定邮箱和手机立即绑定

PHP 在独特情况下通过多个条件进行分组

PHP 在独特情况下通过多个条件进行分组

PHP
哈士奇WWW 2022-09-25 20:25:04
我正在处理由另一个部门管理的数据,并且我得到了重复的数据。有 3 种不同的唯一标识:Order NumberCompany NameCompany Entity有时它是相同的公司名称,但订单号不同。有时它是相同的公司名称,但不同的公司实体。有时它是相同的订单号,但不同的公司名称。有时它是相同的订单号,但不同的公司实体。有时它是相同的公司实体,但订单号不同。有时它是相同的公司实体,但不同的公司名称。有时公司名称缩写为苹果,苹果公司,苹果纽约等。下面我有一个包含示例数据的表格:CompanyName      CompanyEntity   OrderNumber   Apple            123             555123            Apple            123             555123         Telsa            888             444444         Telsa            777             222222         Apple NYC        103             544523       Stack            222             511523                  Stack            222             144523       我需要按公司名称或公司实体或订单号进行分组。我试过了: $query = "SELECT nextgenorders2.nextgenorder_ordernumber, nextgenorders2.nextgenorder_serial, nextgenorders2.nextgenorder_company_entity, nextgenorders2.nextgenorder_companyname, nextgenorders2.nextgenorder_deliverydate, FROM nextgenorders2 WHERE nextgenorders2.nextgenorder_deliverydate='2020-11-11'  GROUP BY nextgenorders2.nextgenorder_companyname,          nextgenorders2.nextgenorder_company_entity,           nextgenorders2.nextgenorder_ordernumber ";该查询将生成:CompanyName      CompanyEntity   OrderNumber   Apple            123             555123            Telsa            888             444444         Telsa            777             222222         Apple NYC        103             544523       Stack            222             511523                  如果该行具有相同的公司名称、公司实体和订单号,则会将其放入一个组中。如果该行没有相同的公司实体、公司名称和订单号,则不会将其放入组中。我希望查询生成以下内容:CompanyName      CompanyEntity   OrderNumber   Apple            123             555123                Telsa            888             444444                           Stack            222             144523       但是我会采取这个,因为多个公司名称缩写:CompanyName      CompanyEntity   OrderNumber   Apple            123             555123                    Telsa            777             222222         Apple NYC        103             544523       Stack            222             511523      
查看完整描述

1 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

你可以做这样的事情


但是对于您拥有的每一列,请决定如何处理它。像MIN(n2.nextgenorder_company_entity),但如果你想保留所有你可以使用GROUP_CONCAT例如


CREATE TABLE nextgenorders2

    (`nextgenorder_companyname` varchar(9), `nextgenorder_company_entity` int, `nextgenorder_ordernumber` int, nextgenorder_deliverydate date)

;


INSERT INTO nextgenorders2

    (`nextgenorder_companyname`, `nextgenorder_company_entity`, `nextgenorder_ordernumber`,nextgenorder_deliverydate)

VALUES

    ('Apple', 123, 555123,'2020-11-11'),

    ('Apple', 123, 555123,'2020-11-11'),

    ('Telsa', 888, 444444,'2020-11-11'),

    ('Telsa', 777, 222222,'2020-11-11'),

    ('Apple NYC', 103, 544523,'2020-11-11'),

    ('Stack', 222, 511523,'2020-11-11'),

    ('Stack', 222, 144523,'2020-11-11')

;


SELECT

 GROUP_CONCAT(n2.nextgenorder_ordernumber),

 #n2.nextgenorder_serial,

 MIN(n2.nextgenorder_company_entity),

 n2.nextgenorder_companyname,

 n2.nextgenorder_deliverydate

 FROM 

    (SELECT REPLACE(`nextgenorder_companyname`,'Apple NYC','Apple') `nextgenorder_companyname`

    , `nextgenorder_company_entity`, `nextgenorder_ordernumber`,nextgenorder_deliverydate

    FROM nextgenorders2) n2

 WHERE n2.nextgenorder_deliverydate='2020-11-11' 

 GROUP BY n2.nextgenorder_companyname

          ,n2.nextgenorder_deliverydate

          #,n2.nextgenorder_ordernumber

GROUP_CONCAT(n2.nextgenorder_ordernumber) | MIN(n2.nextgenorder_company_entity) | nextgenorder_companyname | nextgenorder_deliverydate

:---------------------------------------- | ----------------------------------: | :----------------------- | :------------------------

555123,555123,544523                      |                                 103 | Apple                    | 2020-11-11               

511523,144523                             |                                 222 | Stack                    | 2020-11-11               

444444,222222                             |                                 777 | Telsa                    | 2020-11-11               

db<>在这里


更多解释


查询的核心是


(SELECT REPLACE(`nextgenorder_companyname`,'Apple NYC','Apple') `nextgenorder_companyname`

, `nextgenorder_company_entity`, `nextgenorder_ordernumber`,nextgenorder_deliverydate

FROM nextgenorders2) n2

这替换了公司名称,因此在这种情况下,Apple NYC成为Apple,这有点耗时,因此您应该考虑创建一个列母公司,但如果只有几个,您可以像我一样手动执行此操作。


Group By被简化为只有公司名称 ,因为这是我们的主要目标,要获得有关该信息的所有信息,交货日期就在那里,因为通常您会查找整个星期,因此如果您决定查看两个或更多日期,它已经分组了。


选择只是一个例子,因为不知道,你正在搜索什么,你的查询没有给我任何线索。


但是基数是针对每一列的,即不在 Group By 子句中,你需要一个聚合函数,以便开发人员必须决定每列他想要查看哪些数据。


在我的情况下,我决定查看所有订单号,如果你只需要你采取的订单数量计数。


该实体不在集团中,因为如果您只想从整体上看公司,我不明白为什么您需要任何实体,最小值只是因为您选择了特斯拉777而不是888,但我不知道您需要它做什么


查看完整回答
反对 回复 2022-09-25
  • 1 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号