Я согласен с послушанием Гордона против сохранения списка таким образом.
FIND_IN_SET()
проверяет, есть ли целое число где-либо в списке.
RIGHT()
не будет проверять подходящее граница. Таким образом, «21» будет соответствовать «3,10,56,111,321». Насколько я понимаю, вопрос должен соответствовать только «321».
RIGHT()
, плюс префикс «,», «321» будет соответствовать «3,10,56,111,321», но не с «321» .
До 8.0 "[[: <:]] 321 $" мог быть сконструирован для использования в качестве регулярного выражения, и <code>\\b нельзя использовать.
MySQL 8.0 не хотелось бы приведенное выше регулярное выражение, но можно использовать "\\b321$"
.
Итак ...
План A: Объединить некоторые из приведенных выше тестов и надеяться, что вы не пропустили краевой случай.
План Б: Сделайте так, как предложил Гордон: исправьте схему.
ОК, думаю, это может быть самое короткое:
WHERE SUBSTRING_INDEX(colB, ',', -1) = colA
mysql> SELECT SUBSTRING_INDEX('321', ',', -1) = '321';
+-----------------------------------------+
| SUBSTRING_INDEX('321', ',', -1) = '321' |
+-----------------------------------------+
| 1 |
+-----------------------------------------+
+----------------------------------------+
| SUBSTRING_INDEX('321', ',', -1) = '21' |
+----------------------------------------+
| 0 |
+----------------------------------------+
+-------------------------------------------+
| SUBSTRING_INDEX('7,321', ',', -1) = '321' |
+-------------------------------------------+
| 1 |
+-------------------------------------------+
+----------------------------------------------+
| SUBSTRING_INDEX('7,321,11', ',', -1) = '321' |
+----------------------------------------------+
| 0 |
+----------------------------------------------+