我有一个带有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)
也就是说,
- 将分号更改为逗号
FIND_IN_SET()
搜索- 针对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/