首页 > 解决方案 > PHP MySQL Group by 多个条件在一个独特的情况下

问题描述

我正在处理由另一个部门管理的数据,并且我得到了重复。

有 3 种不同的唯一标识:

Order Number
Company Name
Company Entity

有时它的公司名称相同但订单号不同。

有时它的公司名称相同,但公司实体不同。

有时它的订单号相同,但公司名称不同。

有时它的订单号相同,但公司实体不同。

有时它是同一公司实体,但订单号不同。

有时它的公司实体相同,但公司名称不同。

有时公司名称缩写为 Apple、Apple Inc、Apple NYC 等。

下面我有一个包含示例数据的表格:

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                  

感谢您的帮助。

标签: phpmysql

解决方案


你可以做这样的事情

但是对于您拥有的每一列,您都需要决定如何处理它。像 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) | 最小值(n2.nextgenorder_company_entity)| nextgenorder_companyname | nextgenorder_deliverydate
:---------------------------------------------------- | ----------------------------------: | :------------------------ | :------------------------
555123,555123,544523 | 103 | 苹果 | 2020-11-11               
511523,144523 | 222 | 堆栈 | 2020-11-11               
444444,222222 | 第777章 特斯拉 | 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,这有点耗时,因此您应该考虑创建一个列 Mother company,但如果只有几个,您可以像我一样手动制作。

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

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

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

就我而言,如果您只需要 COUNT 个订单,我决定查看所有订单号。

该实体不在 Group by 中,因为如果您只想查看公司的整体,我不明白为什么您根本需要任何实体,最小值只是因为您选择了 Tesla 777 而不是 888,但是我不知道你需要它做什么


推荐阅读