mysql - 我可以在 LIKE 语句中使用 IN 方法吗?

标签 mysql sql

我有一个存储一组问题的表。每个问题与最少 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),+";

DEMO

您可以根据自己的需要更改RegExp

例如,对于主题 17 和第 22 节,然后是 REGEXP ('^17,22,+')

关于mysql - 我可以在 LIKE 语句中使用 IN 方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56884853/

相关文章:

mysql - 数据库规范化——相同字段,不同表

mysql - 除以零错误sql

java - 如何使用jOOQ RecordUnmapper?

python - 大量更新的脚本优化

在 bash 中找不到 mysql 命令

php - POST 数据太大。减少数据或增加 "post_max_size"

sql - 查询性能INNER JOIN ON和比较

mysql - SQL如何像Excel一样使用公式填充列

php - 我想接收来自特定位置的邮件

sql - 在单个查询中重命名混合大小写表