在 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_prod
在SELECT
中,但不在GROUP BY
中,为什么p.pack_size
在GROUP BY
中而不在SELECT
中。
所有这些括号和空格只会使查询看起来比实际更复杂。
在查询中使用LEFT JOIN
s 并按不在第一个表中的列进行聚合也是不规则的——因为它会在不匹配的行上有NULL
值。我怀疑您希望 products
作为 FROM
中的第一个表引用。
【讨论】:
以上是关于在 MySQL 中按查询分组,忽略括号内的值的主要内容,如果未能解决你的问题,请参考以下文章