Как получить данные из MariaDB, используя точку с запятой

Доброе утро!

У меня есть база данных с двигателем MariaDB 5.5.x. В базе данных у меня есть таблица «items»:

Table "items"------------
ID |name      | location | ... |
--------------------------
1  |some name1| 3;56;23;15;4; |
-----------------------
2  |some name2| 4;8;90;   |
-----------------------
3  |some name3| 6;27;18;87;|

Я ищу способ получить идентификатор, когда я знаю location_ID fx. «90». Все местоположения в базе данных разделены точкой с запятой («;»). На Zend я использовал и все заработало:

where("location REGEXP '(^|[[.semicolon.]])" . $id . "([[.semicolon.]]|$)'");

Я программировал на Slim Framework с классом MeekroDB. Мой текущий код в PHP:

$DB = new DB(); //MeekroDB PHP Class
$data = $DB::query("SELECT * FROM items WHERE locations REGEXP '(^|[[.semicolon.]])%s([[.semicolon.]]|$)'" , $id);

$ id является целым числом. Я получаю ошибку:

ЗАПРОС: ВЫБЕРИТЕ * ИЗ ИЗДЕЛИЙ, ГДЕ МЕСТО РЕГИЭК
‘(^ | [[. точка с запятой.]])’ 1 ‘([[. точка с запятой.]] | $)’ ОШИБКА: у вас есть ошибка
в вашем синтаксисе SQL; проверьте руководство, которое соответствует вашей MariaDB
версия сервера для правильного синтаксиса для использования рядом
‘1’ ([[. Точка с запятой.]] | $) » В строке 1

Есть идеи, что не так?

0

Решение

mysql> SELECT FIND_IN_SET('87', REPLACE('6;27;18;87', ';', ','));
+----------------------------------------------------+
| FIND_IN_SET('87', REPLACE('6;27;18;87', ';', ',')) |
+----------------------------------------------------+
|                                                  4 |
+----------------------------------------------------+
1 row in set (0.00 sec)

То есть,

  1. измените точку с запятой на запятую
  2. FIND_IN_SET() искать
  3. проверьте 0, чтобы увидеть, присутствует ли он. 0 = ложь,> 0 = истина.

Ваш код будет что-то вроде

DB::query("SELECT * FROM items
WHERE FIND_IN_SET(%s, REPLACE(locations, ';', ','))",
$id);
0

Другие решения

MariaDB 5.5.x не имеет [[.semicolon.]], Вместо этого используйте простую точку с запятой:

SELECT * FROM items WHERE location REGEXP '(^|;)8(;|$)'

http://sqlfiddle.com/#!9/0c5cb/1

До MariaDB 10.0.5 использовалась библиотека регулярных выражений, соответствующая POSIX 1003.2, которая не имеет [[.semicolon.]]. Начиная с MariaDB 10.0.5 на PCRE используется библиотека, которая поддерживает [[.semicolon.]]. https://mariadb.com/kb/en/mariadb/regular-expressions-overview/

0

По вопросам рекламы [email protected]