Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 我可以在LIKE语句中使用IN方法吗?_Mysql_Sql - Fatal编程技术网

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

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 主题存储为主题、章节和章节

我有一张存储一组问题的桌子。每个问题至少与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个搜索序列。
*主题、章节和章节
如'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,)+')