我有一个比较,我想在SQL中提高效率。
输入字段(fldInputField)是逗号分隔的“1,3,4,5”列表
数据库有一个字段(fldRoleList),其中包含“1,2,3,4,5,6,7,8”
因此,对于fldRoleList中第一次出现的fldInputField,请告诉我们它是哪个值。
有没有办法在MySQL或存储过程中实现以下功能?
伪代码
SELECT * 从aTable t1 WH1在t1.fldRoleList中的fldInputField
/伪代码
我猜可能有一些最适合这种比较的函数?我在搜索中找不到任何内容,如果有人可以指示我,我会删除这个问题...谢谢!
更新:这不是理想(或好)做事的方式。它是继承的代码,我们只是试图快速修复,同时我们通过规范化的行来构建逻辑来处理这个问题。幸运的是,这不是大量使用的代码。
答案 0 :(得分:3)
我同意@Ken White的answer,逗号分隔的列表在规范化数据库设计中没有位置。
如果将fldRoleList
存储为从属表中的多行,则解决方案将更简单并且表现更好:
SELECT t1.*, r1.fldRole
FROM aTable t1 JOIN aTableRoles r1 USING (aTable_id)
WHERE FIND_IN_SET(r1.fldRole, fldInputField);
(参见MySQL函数FIND_IN_SET()
)
但是,如果多个角色与逗号分隔的输入字符串匹配,则输出多行。如果您需要将结果限制为每aTable
条目一行,并使用第一个匹配角色:
SELECT t1.*, MIN(r1.fldRole) AS First_fldRole
FROM aTable t1 JOIN aTableRoles r1 USING (aTable_id)
WHERE FIND_IN_SET(r1.fldRole, fldInputField);
GROUP BY t1.aTable_id;
答案 1 :(得分:2)
你知道,你有一个糟糕的架构设计。以逗号分隔的列表在数据库中没有业务。
那就是说......你在寻找喜欢。
SELECT * FROM aTable t1 WHERE t.fldRoleList LIKE fldInputField + '%'
如果内容在开头可能并不总是匹配,请在fldInputField之前添加另一个百分号。
SELECT * FROM aTable t1 WHERE t.fldRoleList LIKE '%' + fldInputField + '%'