在 MySQL 中按查询分组,忽略括号内的值

Posted

技术标签:

【中文标题】在 MySQL 中按查询分组,忽略括号内的值【英文标题】:Group by query in MySQL ignoring the values inside brackets 【发布时间】:2021-03-30 11:23:07 【问题描述】:

我有一个带有 groupby 子句的 SQL 查询 查询如下所示:

SELECT
    products.product_name AS product_name,
    contracts_balance.contract_prod AS contract_prod, 
     SUM( contracts.opt_one_firm + contracts.opt_two_firm + contracts.opt_three_firm +contracts.opt_four_firm +contracts.opt_five_firm +contracts.opt_six_firm)
     AS total_open_balance
FROM
    (
        (
            contracts_balance
        LEFT JOIN products ON
            (
                (
                    contracts_balance.product_id_fk = products.product_id
                )
            )
        )
    LEFT JOIN supplier ON
        (
            (
                products.supplier_id_fk = supplier.supplier_id
            )
        )

         LEFT JOIN contracts ON
        (
            (
                contracts_balance.contract_id_fk = contracts.contract_id
            )
        )
    )
GROUP BY
    products.product_name ,  products.pack_size

输出如下:

在 group by 查询中,我希望查询按名称分组,忽略括号 () 内的文本 所以,它应该只返回 8 行。

谢谢

【问题讨论】:

【参考方案1】:

你可以使用substring_index():

SELECT SUBSTRING_INDEX(p.product_name, ' (', 1) AS product_name,
       cb.contract_prod AS contract_prod, 
       SUM( c.opt_one_firm + c.opt_two_firm + c.opt_three_firm + c.opt_four_firm + c.opt_five_firm + contracts.opt_six_firm) AS total_open_balance
FROM contracts_balance cb LEFT JOIN
     products p
     ON cb.product_id_fk = p.product_id LEFT JOIN
     supplier s
     ON p.supplier_id_fk = s.supplier_id LEFT JOIN
     contracts c
     ON cb.contract_id_fk = c.contract_id
GROUP BY SUBSTRING_INDEX(p.product_name, ' (', 1), cb.contract_prod;

注意事项:

表别名使查询更易于编写和阅读。 SELECT 中的未聚合列应与 GROUP BY 键匹配。我不明白为什么cb.contract_prodSELECT 中,但不在GROUP BY 中,为什么p.pack_sizeGROUP BY 中而不在SELECT 中。 所有这些括号和空格只会使查询看起来比实际更复杂。

在查询中使用LEFT JOINs 并按不在第一个表中的列进行聚合也是不规则的——因为它会在不匹配的行上有NULL 值。我怀疑您希望 products 作为 FROM 中的第一个表引用。

【讨论】:

以上是关于在 MySQL 中按查询分组,忽略括号内的值的主要内容,如果未能解决你的问题,请参考以下文章

忽略花括号中的值

正则表达式用于选择花括号内的双引号而忽略外部的引号

按日期计算查询分组忽略时间

MySQL进阶5--分组排序和分组查询 group by(having) /order by

在 mysql 和 oracle 中按查询分组

特定类型的查询