当前位置:   article > 正文

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

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

力扣题

1、题目地址

2118. 建立方程

2、模拟表

表:Terms

Column NameType
powerint
factorint
  • 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 表:

powerfactor
21
1-4
02

输出:

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

示例二

输入:
Terms 表:

powerfactor
4-4
21
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

代码分析

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

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

第二步,使用 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

假设模拟数据

powerfactor
6712
8254

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

select concat(
           IF(factor < 0, factor, concat('+', factor)), 
           IF(power = 0, '', 'X'), 
           IF(power < 2, '', concat('^', power))
       ) AS value
from Terms
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
| value   |
| ------- |
| +12X^67 |
| +54X^82 |
  • 1
  • 2
  • 3
  • 4
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
| value   |
| ------- |
| +54X^82 |
| +12X^67 |
  • 1
  • 2
  • 3
  • 4

第二步,正常去使用 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
| equation         |
| ---------------- |
| +12X^67+54X^82=0 |
  • 1
  • 2
  • 3
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
| equation         |
| ---------------- |
| +12X^67+54X^82=0 |
  • 1
  • 2
  • 3

我们如果改成输出 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
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
| equation         |
| ---------------- |
| +54X^82+12X^67=0 |
  • 1
  • 2
  • 3

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

用法可参考我以前文章

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/241408?site
推荐阅读
相关标签
  

闽ICP备14008679号