这个问题在这里已经有答案了:
我可以将多个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解决方案?
1条答案
按热度按时间q7solyqu1#
你在找这样的事不?
sql小提琴
查询1:
结果:
问题2:
结果:
官方文件:https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_group-康卡特