有人可以给我一个查询,结果将返回第 1 行和第 3 行吗?
ID Name Hidden
1 Mika 1,4,2
2 Loca 0
3 Nosta 4
4 Like 2
像这样的东西 SELECT * FROM table WHERE Hidden HAVING(4)
SELECT * FROM table WHERE FIND_IN_SET('4',Hidden);
FIND_IN_SET的文档
SELECT * FROM table WHERE CONCAT(',',Hidden,',') LIKE '%,4,%'
或者你可以避免像这样使用 LIKE
SELECT * FROM table WHERE INSTR(CONCAT(',',Hidden,','), ',4,') > 0
这不会得到 40、14 等内容,但您需要确保 Hidden 字段中没有空格(例如,1, 4, 5
或相应地更新 concat 和 LIKE 函数。
SELECT * FROM table WHERE Hidden LIKE '%4%'
% 是通配符。
只要您使用正确的分词符,全文搜索可能是一个合理的解决方案。
按照建议使用全文搜索,或者
将隐藏值旋转到一个单独的表中,并带有当前行的 ID。
例如,Mika 将在此表中包含三个条目
ID = 1,隐藏 =1
ID = 1,隐藏 =4
ID = 1,隐藏 =2
然后,您可以针对此分拆表返回结果。
您可能还需要考虑规范化表并将这些“隐藏”值存储在一个单独的表中,并在适当的列上使用索引。根据您拥有的行数,这会更快:
ID Hidden
1 1
1 4
1 2
3 4
4 2
和:
SELECT DISTINCT table.* FROM table, hidden_table WHERE table.ID = hidden_table.ID AND hidden_table.hidden = 4