mysql解决方案,基于2个匹配ID连接多行文本

xbp102n0  于 2021-08-01  发布在  Java
关注(0)|答案(1)|浏览(289)

这个问题在这里已经有答案了

我可以将多个mysql行连接到一个字段中吗(11个答案)
10个月前关门了。
我使用的是mysql(5.5.65-mariadb),有一个由表组成的应用程序, generated_text_tbl . 以下是此表中的一些示例数据。

-----------------------------------------------
id | substance_id | display_id | generated_text   
-----------------------------------------------
1  | 54           | 139        | foo
-----------------------------------------------
2  | 54           | 139        | bar
----------------------------------------------
3  | 1933         | 139        | baz
-----------------------------------------------  
4  | 38           | 27         | xyz
-----------------------------------------------
``` `id` 是一个 `AUTO_INCREMENT` 现场。这个 `substance_id` 以及 `display_id` 是引用其他表中记录的外键( `substances.id` 以及 `display.id` 分别)。
我想从 `generated_text` 用html换行符分隔字段( `<br>` )-如果匹配 `substance_id` 以及 `display_id` 行已存在。如果没有匹配项(即单个行),则 `generated_text` 仍应输出,但不需要 `<br>` 因为没有什么可以分开。
我有一个解决这个问题的方法,它可以在php中工作,但是如果可能的话,我想要一个纯sql解决方案。我已经写出了我的逻辑,因为这在技术上是可行的,尽管是在php中。
对于上述示例数据,正确的输出如下: `foo<br>bar` :因为有两行 `substance_id` 以及 `display_id` 匹配(分别为54和139)。 `baz` :只有一行 `WHERE substance_id = 1933 AND display_id = 139` . `xyz` :与上面的逻辑相同,只有一行 `WHERE substance_id = 38 AND display_id = 27` .
从逻辑上讲,我的php脚本是这样工作的:
都是独一无二的 `substance_id` 的被加载到数组中。相当于sql `SELECT DISTINCT(substance_id) FROM generated_text_tbl` .
都是独一无二的 `display_id` 的被加载到数组中。相当于sql `SELECT DISTINCT(display_id) FROM generated_text_tbl` .
在(2)上有内环的情况下通过(1)。这有效地循环了每一个 `substance_id` 以及 `display_id` 组合,即: `substance_id = 54 AND display_id = 139` (2排) `substance_id = 54 AND display_id = 27` (0行) `substance_id = 1933 AND display_id = 139` (1行) `substance_id = 1933 AND display_id = 27` (0行) `substance_id = 38 AND display_id = 139` (0行) `substance_id = 38 AND display_id = 27` (1行)
然后获得一个 `generated_text` 基于上述情况。如果数组大小大于1个元素,则 `<br>` 字符添加在每个字符之间。如果只是一个元素 `<br>` 字符不是必需的,因为只有一行 `generated_text` 所以没什么需要分手的。

// Store the output text
$output = '';

// e.g. $result contains MySQL rows WHERE substance_id = 54 AND display_id = 139
if (sizeof($result) == 1) {
$output = $result['generated_text'];
} else {
foreach ($result as $key => $value) {
$output .= $value['generated_text'] . "";
}
$output = (substr($output), 0, -4); // Remove trailing
}

结果 `var_dump($output)` 因为上面的脚本是 `foo<br>bar` ,这就是我想要的。
虽然这在逻辑上是有效的,但它效率很低(当数据库中有数千行时) `generated_text` 表)。有没有纯sql解决方案?
q7solyqu

q7solyqu1#

你在找这样的事不?
sql小提琴
查询1:

SELECT 
  `substance_id` , 
  `display_id`, 
  GROUP_CONCAT( `generated_text` SEPARATOR '<br>' ) as concact_text
from generated_text_tbl 
group by 
  `substance_id` , 
   `display_id`

结果:

| substance_id | display_id | concact_text |
|--------------|------------|--------------|
|           38 |         27 |          xyz |
|           54 |        139 |   foo<br>bar |
|         1933 |        139 |          baz |

问题2:

SELECT 
  `substance_id` , 
  `display_id`, 
  GROUP_CONCAT( `generated_text` ORDER BY id DESC SEPARATOR '<br>') as concact_reverse_text
from generated_text_tbl 
group by 
  `substance_id` , 
   `display_id`

结果:

| substance_id | display_id | concact_reverse_text |
|--------------|------------|----------------------|
|           38 |         27 |                  xyz |
|           54 |        139 |           bar<br>foo |
|         1933 |        139 |                  baz |

官方文件:https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_group-康卡特

相关问题