我有一个存储一组问题的表。每个问题与最少 1 个和最多 3 个主题相关联。
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个搜索场景。
* 主题、章节和章节 LIKE '17,22,98
* 子主题和部分 LIKE '17,22,%'
* 仅限主题 LIKE '17,%'
有没有其他方法可以降低查询的复杂性?我可以在 LIKE
语句中使用 IN
方法吗?
注意:我不能改变结构的方式。该项目已经由另一个用户实现,我没有太多时间来更改结构。所以,请了解情况。
最佳答案
您可以在 OR 条件下使用 RegExp
SELECT * FROM QUESTION_TABLE
WHERE subject1 REGEXP "^(1|17|5),+"
OR subject2 REGEXP "^(1|17|5),+"
OR subject3 REGEXP "^(1|17|5),+";
您可以根据自己的需要更改RegExp
例如,对于主题 17 和第 22 节,然后是 REGEXP ('^17,22,+')
关于mysql - 我可以在 LIKE 语句中使用 IN 方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56884853/