使用从MySQL中的SELECT上的替换使用列数据引导到不同行的同一输出

发布于 2025-02-13 10:59:35 字数 1525 浏览 0 评论 0 原文

这是我要做的事情的简化版本,这表明问题最好。我的数据库看起来像这样:

用户表:

user_id first_name
1 bob
2 dave
3 steven

设置表:

名称
format_string hello {first_name}!

现在,我想为每个用户插入的用户数据检索Format_string。 如果我将我的Format_string进行了将我的format_string进行编码,则可以使用:

SELECT first_name,
REPLACE(
    "Hello {first_name}!",
    "{first_name}",
    first_name
)
AS greeting
FROM users

我会得到此输出,这是可以预期的:

first_name 问候
鲍勃 Hello Bob!
戴夫 你好戴夫!
史蒂文 你好史蒂文!

但是,如果我从设置表中使用format_string,那么

SELECT first_name,
REPLACE(
    (SELECT value FROM settings WHERE name = "format_string"),
    "{first_name}",
    first_name
)
AS greeting
FROM users

我会得到此输出,这绝对不是预期:

first_name 问候
鲍勃 Hello Bob!
戴夫 你好鲍勃!
史蒂文 你好鲍勃!

有人知道问题所在以及如何解决吗?

Here is a simplified version of what I'm trying to do, which shows the problem best. My database looks like this:

users table:

user_id first_name
1 Bob
2 Dave
3 Steven

settings table:

name value
format_string Hello {first_name}!

Now I want to retrieve the format_string with inserted user data for every user.
If I hardcode the my format_string into my SQL like this, it works:

SELECT first_name,
REPLACE(
    "Hello {first_name}!",
    "{first_name}",
    first_name
)
AS greeting
FROM users

I get this output, which is expected:

first_name greeting
Bob Hello Bob!
Dave Hello Dave!
Steven Hello Steven!

But if I use the format_string from my settings table, like this:

SELECT first_name,
REPLACE(
    (SELECT value FROM settings WHERE name = "format_string"),
    "{first_name}",
    first_name
)
AS greeting
FROM users

I get this output, which is absolutely not expected:

first_name greeting
Bob Hello Bob!
Dave Hello Bob!
Steven Hello Bob!

Does anyone know what the problem there is and how to fix it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

古镇旧梦 2025-02-20 10:59:35

我无法解释问题是什么。您可能已经在数据库引擎中找到了一个错误。我无法访问较新的MariadB(DBFiddle的较新版本似乎破坏了),但是虽然Mariadb 10.3和MySQL 5.5似乎都能提供您的输出,但MySQL 5.6给出了预期的一个,因此找到了错误并修复了错误。

通过连接而不是子查询重写查询似乎在任何引擎中都可以使用:

SELECT REPLACE(settings.value, "{first_name}", users.first_name) as greeting
FROM
  users,
  settings
WHERE settings.name = 'format_string';

I can't explain what the problem is. You might have found a bug in the database engine. I don't have access to newer MariaDB (dbfiddle's newer versions seem broken), but while both MariaDB 10.3 and MySQL 5.5 seem to give your output, MySQL 5.6 gives the expected one, so the bug was found and fixed.

Rewriting your query with a join instead of a subquery seems to work in any engine:

SELECT REPLACE(settings.value, "{first_name}", users.first_name) as greeting
FROM
  users,
  settings
WHERE settings.name = 'format_string';
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文