Могу ли я использовать метод IN в операторе LIKE? - PullRequest
1 голос
/ 04 июля 2019

У меня есть таблица, в которой хранится набор вопросов. Каждый вопрос связан минимум с 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,%'

Есть ли другой способ уменьшить эту сложность в запросе? Могу ли я использовать метод IN в операторе LIKE?

Примечание : Я не могу изменить структуру. Проект уже реализован другим пользователем, и у меня не так много времени, чтобы изменить структуру. Поэтому, пожалуйста, поймите ситуацию.

Ответы [ 3 ]

2 голосов
/ 04 июля 2019

Вы можете использовать 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 * ​​1010 *

0 голосов
/ 04 июля 2019

Я нахожу решение, используя REGEXP

SELECT * FROM questions
WHERE subject1 REGEXP  ('^(17,|1,|5,)+')
 OR   subject2 REGEXP  ('^(17,|1,|5,)+')
 OR   subject3 REGEXP  ('^(17,|1,|5,)+')

У кого-нибудь есть лучшее решение?Нелегко сгенерировать этот запрос, если есть сценарий с поиском 17,255,303 или 1405,555,

0 голосов
/ 04 июля 2019

Вы можете попробовать использовать find_in_set()

SELECT * FROM questions WHERE find_in_set(subject1,(1,17,5))>0 
OR find_in_set(subject2,(1,17,5))>0 OR find_in_set(subject3,(1,17,5))>0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...