gpt4 book ai didi

MySQL IN() 子句多次返回

转载 作者:行者123 更新时间:2023-11-29 08:38:38 25 4
gpt4 key购买 nike

我有一个特殊的数据环境,我需要以某种方式返回数据来填充表。

这是我当前的查询:

SELECT 
bs_id,
IF(bs_board = 0, 'All Boards', (SELECT b_name FROM certboards WHERE b_id IN (REPLACE(bs_board, ';', ',')))) AS board
FROM boardsubs

如你所见,我有一个 if语句然后是一个特殊的子选择。

我有这个的原因是字段 bs_boardvarchar包含多个行 ID 的字段,如下所示:

1;2;6;17

所以,像这样的查询工作正常,但它只返回第一个匹配的 b_name 。我需要它返回所有匹配项。例如,这是 1;2它应该返回两个板 Board 1Board 2在同一列中。稍后我可以处理添加 <br>在每个结果之间。

但我正在处理的问题是,它必须在单个列中返回两个名称或所有名称,因为该字段可以包含与原始编辑器选择的数量一样多的名称。

最佳答案

这不会按照您想象的方式工作。

假设 bs_board'1;2;3'

在您的查询中,REPLACE(bs_board, ';', ',') 将解析为 '1,2,3',它是单个文字字符串。这将构成您的最终子查询:

SELECT b_name FROM certboards WHERE b_id IN ('1,2,3')

这相当于:

SELECT b_name FROM certboards WHERE b_id = '1,2,3'

该问题最正确的解决方案是normalize your database 。您当前的系统或在单个字段中存储多个值正是您永远不应该使用 RDBMS 执行的操作,这就是原因。该数据库不是为处理此类字段而设计的。您应该有一个单独的表,每个bs_board占一行,然后JOIN这些表。

这个问题目前还没有好的解决方案。这是一个基本的架构设计缺陷。最简单的方法是使用应用程序逻辑来修复它。首先你运行:

SELECT bs_id, bs_board FROM boardsubs

从那里您可以解析应用程序逻辑中的 bs_board 字段并构建您想要运行的实际查询:

SELECT bs_id, 
IF(bs_board = 0, 'All Boards', (SELECT b_name FROM certboards WHERE b_id IN (<InsertedStringHere>) AS board
FROM boardsubs

还有其他方法可以解决该问题,但您会遇到排序顺序、匹配以及许多其他问题。最好的解决方案是添加一个表并将这个多值字段移到该表中。

关于MySQL IN() 子句多次返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14489752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com