Mysql 我可以在LIKE语句中使用IN方法吗?
我有一张存储一组问题的桌子。每个问题至少与1个主题相关,最多与3个主题相关Mysql 我可以在LIKE语句中使用IN方法吗?,mysql,sql,Mysql,Sql,我有一张存储一组问题的桌子。每个问题至少与1个主题相关,最多与3个主题相关 QUESTION_TABLE --------------- id => INT (primary key) question => VARCHAR subject1 => VARCHAR subject2 => VARCHAR subject3 => VARCHAR created_at => DATETIME 主题存储为主题、章节和章节
QUESTION_TABLE
---------------
id => INT (primary key)
question => VARCHAR
subject1 => VARCHAR
subject2 => VARCHAR
subject3 => VARCHAR
created_at => DATETIME
主题存储为主题、章节和章节的组合,并用逗号分隔。下面是我的一些数据示例
| id | question | subject1 | subject2 | subject3 | created_at |
--------------------------------------------------------------------------
| 1 | some text.. | 1, | 17, | 9,33,5 | 2019-01-12 11:45:26
| 2 | some text.. | 17,22,98 | 1, | 12,10 | 2019-02-22 15:23:10
| 3 | some text.. | 9,33 | | | 2019-03-13 12:04:43
| 4 | some text.. | 17, | 5, | 1, | 2019-04-05 05:30:12
我需要得到与[1,17,5]
相关的主题的问题,这些主题是动态数据。为此,我使用下面的查询
SELECT * FROM questions
WHERE subject1 LIKE '1,%' OR subject2 LIKE '1,%' OR subject3 LIKE '1,%'
OR subject1 LIKE '17,%' OR subject2 LIKE '17,%' OR subject3 LIKE '17,%'
OR subject1 LIKE '5,%' OR subject2 LIKE '5,%' OR subject3 LIKE '5,%'
将有3个搜索序列。*主题、章节和章节
如'17,22,98
*子项和部分
如“17,22,%”
*仅subejct
如'17,%'
有没有其他方法可以降低查询的复杂性?我可以使用中的和语句中的方法吗
注意:我不能改变结构的方式。该项目已经由另一个用户实现,我没有太多时间来更改结构。因此,请理解这种情况。您可以尝试使用find\u in\u set()
可以将RegExp与或条件一起使用
SELECT * FROM QUESTION_TABLE
WHERE subject1 REGEXP "^(1|17|5),+"
OR subject2 REGEXP "^(1|17|5),+"
OR subject3 REGEXP "^(1|17|5),+";
您可以根据需要更改RegExp
e、 g对于主题17和第22节,然后REGEXP(“^17,22,+”)
我使用REGEXP
SELECT * FROM questions
WHERE subject1 REGEXP ('^(17,|1,|5,)+')
OR subject2 REGEXP ('^(17,|1,|5,)+')
OR subject3 REGEXP ('^(17,|1,|5,)+')
有谁有更好的解决方案吗?
如果出现搜索范围为17255303
或1405555,
的场景,则生成此查询并不容易。如果在subject1中只有1个值,那么结尾是否有逗号,或者是否有输入错误?因此没有“1”或“17”,而是“1”和“17”。@forpas:no.这不是输入错误。每个值表示,第一个值是主题
,第二个值是章节
,最后一个值是章节
。如果只有一个主题
,它将变成17,
。使用逗号,
和位置检测主题、章节id
是否有其他方法降低查询的复杂性?是的,有:规范化你的数据模型。对不起。这不起作用,因为我需要使用以1、
或17、
或5、
开头的字符串进行搜索。这些字符串似乎是两位数的值,带有前导空格,请切换到其中subject1 REGEXP'(1 | 17 | 5),+'
而不是a。我还尝试了REGEXP
。但是当22,11555
时,这可能会导致错误。我还尝试了使用这个subject1 REGEXP(“^([1][7]|[1]|[5]),”
,并得到了准确的结果。你有更好的解决方案吗?@Nishal我想它不会检测7,
检查这里,当我搜索9,33,5
时,它不会出现。为此,我认为我们需要像subject1regexp('^(17,| 1,| 9,33,5)+')
Change+
将至少一个字符更改为*
零个或多个字符REGEXP'^(17255303 | 1405555,| 5,)*'
SELECT * FROM questions
WHERE subject1 REGEXP ('^(17,|1,|5,)+')
OR subject2 REGEXP ('^(17,|1,|5,)+')
OR subject3 REGEXP ('^(17,|1,|5,)+')