- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个特殊的数据环境,我需要以某种方式返回数据来填充表。
这是我当前的查询:
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_board
是 varchar
包含多个行 ID 的字段,如下所示:
1;2;6;17
所以,像这样的查询工作正常,但它只返回第一个匹配的 b_name
。我需要它返回所有匹配项。例如,这是 1;2
它应该返回两个板 Board 1
和Board 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/
我是一名优秀的程序员,十分优秀!