如何使用分号分隔符从MariaDB获取数据


How get data from MariaDB using semicolon delimiter?

我有一个带有MariaDB 5.5.x引擎的数据库。在数据库上,我有表"项目":

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时,我正在寻找获取ID的方法。"90"。数据库中的所有位置都用分号(";")分隔。在Zend上,我使用了

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

我用MeekroDB Class在Slim Framework上编程。我当前的PHP代码:

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

$id是整数。我得到错误:

查询:从REGEXP所在位置的项目中选择*'(^|[[分号.]])'1'([[分号.]]|$)'错误:您有一个错误在您的SQL语法中;查看与您的MariaDB相对应的手册服务器版本中要使用的正确语法第1行的"1"([[.分号]]|$)"

知道怎么了吗?

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);

MariaDB 5.5.x没有[[.分号]],请使用纯分号:

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

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

在MariaDB 10.0.5之前,使用了符合POSIX 1003.2的正则表达式库,但该库不具有[[.分号.]]。从MariaDB 10.0.5.开始,使用了支持[[.分号]]的PCRE库。https://mariadb.com/kb/en/mariadb/regular-expressions-overview/