我有像这张桌子的结构。
ID Category Publisher
1 1,2 A
2 1 B
3 2 C
4 1 D
5 2 E
6 2,3,1 F
我想要一个查询,当我搜索1,3的类别然后它返回 以下
我尝试过,但没有采用任何优化方式。
ID Category Publisher
1 1,2 A
2 1 B
4 1 D
6 2,3,1 F
答案 0 :(得分:1)
select * from your_table
where find_in_set(1, category) > 0
or find_in_set(3, category) > 0
但实际上你绝不应该在一个列中存储多个值。更好地改变您的桌面设计。
答案 1 :(得分:0)
虽然纯SQL不提供在两个集之间进行比较的工具,但这可以用代码(JavaScript / PHP)或使用存储过程来实现。
为了使用纯SQL,您可以实现一个存储过程以逗号分隔的字符串作为单列临时表返回(this answer和this post可以为您提供实现此目的的想法一部分)。
然后,利用您创建的内容,假设该功能已实现
STR_SPLIT(<string>, <delimiter>)
并返回一个包含名为colName
的单个列的表,您可以写:
SELECT DISTINCT `tblName`.*
FROM `tblName`
INNER JOIN STR_SPLIT('1,3',',') `given`
ON FIND_IN_SET(`given`.`colName`, `category`) > 0
这将获取每个值并单独匹配,这将创建将由DISTINCT
语句消除的重复项,使其成为非理想的解决方案。
我建议在这种情况下使用参考表,这将使这个问题变得轻而易举,或者实现部分解决方案并完成代码端。