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

时间:2015-03-31 21:58:37

标签: php regex mariadb delimiter

我有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时,我正在寻找获取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是整数。我收到错误:

  

QUERY:SELECT * FROM items WHERE location REGEXP   '(^ | [[.semicolon。]])'1'([[.semicolon。]] | $)'错误:你有错误   在你的SQL语法中;查看与MariaDB对应的手册   服务器版本,用于在附近使用正确的语法   '1'([[。分号。]] | $)''在第1行

知道出了什么问题吗?

2 个答案:

答案 0 :(得分: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 =真。
  4. 您的代码将类似于

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

答案 1 :(得分: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。]]。从PCRE库中的MariaDB 10.0.5开始,支持[[.semicolon。]]。 https://mariadb.com/kb/en/mariadb/regular-expressions-overview/