【MySQL】GROUP_CONCAT 运用易错点之建立方程

力扣题

1、题目地址

2118. 建立方程

2、模拟表

表:Terms

Column Name Type
power int
factor int
  • power 是该表具有唯一值的列。
  • 该表的每一行包含关于方程的一项的信息。
  • power 是范围为 [0, 100] 的整数。
  • factor 是范围为 [-100,100] 的整数,且不能为零。

3、要求

你有一个非常强大的程序,可以解决世界上任何单变量的方程。传递给程序的方程必须格式化如下:

1、左边 (LHS) 应该包含所有的术语。
2、右边 (RHS) 应该是零。
3、LHS 的每一项应遵循 “X^” 的格式,其中:

  • 是 “+” 或者 “-”。

  • 是 factor 的 绝对值。

  • 是 power 的值。

  • 如果幂是 1, 不要加上 “^”.
    例如, 如果 power = 1 并且 factor = 3, 将有 “+3X”。

  • 如果幂是 0, 不要加上 “X” 和 “^”.
    例如, 如果 power = 0 并且 factor = -3, 将有 “-3”。

4、LHS 中的幂应该按 降序排序。

编写一个解决方案来构建方程。

4、示例

示例一

输入:
Terms 表:

power factor
2 1
1 -4
0 2

输出:

equation
+1X^4-4X+2=0

示例二

输入:
Terms 表:

power factor
4 -4
2 1
1 -1

输出:

equation
-4X^4+1X^2-1X=0

5、代码编写

我的写法

with tmp as (
    select power, 
           concat(
               IF(factor < 0, factor, concat('+', factor)), 
               IF(power = 0, '', 'X'), 
               IF(power < 2, '', concat('^', power))
           ) AS value
    from Terms
)
select concat(group_concat(value order by power desc separator ''), '=0') AS equation
from tmp

代码分析

第一步,根据要求列出对应的式子进行输出,power 是为了之后拼接使用

select power, 
       concat(
           IF(factor < 0, factor, concat('+', factor)), 
           IF(power = 0, '', 'X'), 
           IF(power < 2, '', concat('^', power))
       ) AS value
from Terms
| power | value |
| ----- | ----- |
| 2     | +1X^2 |
| 1     | -4X   |
| 0     | +2    |

第二步,使用 group_concat 进行拼接,拼接字符使用空字符串就行,记住得根据 power 倒序进行拼接

select concat(group_concat(value order by power desc separator ''), '=0') AS equation
from (
	select power, 
	       concat(
	           IF(factor < 0, factor, concat('+', factor)), 
	           IF(power = 0, '', 'X'), 
	           IF(power < 2, '', concat('^', power))
	       ) AS value
	from Terms
) AS one

说一下为什么需要 power(易错点)

假设模拟数据

power factor
67 12
82 54

第一步,不根据 power 排序(例子里面是顺序,也可能乱序)和根据 power 倒序两种情况,都不输出 power

select concat(
           IF(factor < 0, factor, concat('+', factor)), 
           IF(power = 0, '', 'X'), 
           IF(power < 2, '', concat('^', power))
       ) AS value
from Terms
| value   |
| ------- |
| +12X^67 |
| +54X^82 |
select concat(
           IF(factor < 0, factor, concat('+', factor)), 
           IF(power = 0, '', 'X'), 
           IF(power < 2, '', concat('^', power))
       ) AS value
from Terms
order by power desc
| value   |
| ------- |
| +54X^82 |
| +12X^67 |

第二步,正常去使用 group_concat 进行拼接(对应第一步两种情况)

select concat(group_concat(value separator ''), '=0') AS equation
from (
	select concat(
        IF(factor < 0, factor, concat('+', factor)), 
        IF(power = 0, '', 'X'), 
        IF(power < 2, '', concat('^', power))
    ) AS value
    from Terms
) AS one
| equation         |
| ---------------- |
| +12X^67+54X^82=0 |
select concat(group_concat(value separator ''), '=0') AS equation
from (
	select concat(
        IF(factor < 0, factor, concat('+', factor)), 
        IF(power = 0, '', 'X'), 
        IF(power < 2, '', concat('^', power))
    ) AS value
    from Terms
    order by power desc
) AS one
| equation         |
| ---------------- |
| +12X^67+54X^82=0 |

我们如果改成输出 power,在 group_concat 函数里进行排序

select concat(group_concat(value order by power desc separator ''), '=0') AS equation
from (
	select power,
           concat(
               IF(factor < 0, factor, concat('+', factor)), 
               IF(power = 0, '', 'X'), 
               IF(power < 2, '', concat('^', power))
           ) AS value
    from Terms
)
| equation         |
| ---------------- |
| +54X^82+12X^67=0 |

从结果来看,我们很容易发现一个点,在使用 group_concat 之前提前使用排序是没有效果的,需要在 group_concat 函数中进行使用,这个需要特别注意。

用法可参考我以前文章

【MySQL】CONCAT、CONCAT_WS、GROUP_CONCAT 函数用法

相关推荐

  1. 【MySQL】GROUP_CONCAT 运用建立方程

    2024-03-17 18:38:02       23 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-17 18:38:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-17 18:38:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-17 18:38:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-17 18:38:02       18 阅读

热门阅读

  1. kubeadm部署Kubernetes(k8s) 1.23.0高可用集群

    2024-03-17 18:38:02       21 阅读
  2. 简单理解promise。。。

    2024-03-17 18:38:02       22 阅读
  3. python爬取B站CC字幕(隐藏式字幕)

    2024-03-17 18:38:02       18 阅读
  4. 微服务的无状态、版本控制向后兼容、流量整型

    2024-03-17 18:38:02       16 阅读
  5. IBatis与MyBatis区别

    2024-03-17 18:38:02       18 阅读