2015-03-31 96 views
0

早上好!如何使用分號分隔符從MariaDB獲取數據

我有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。 「90後」。所有位置都以分號(「;」)分隔數據庫。在Zend的我曾經和它的工作:在超薄框架與MeekroDB類

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

我編程。我在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.]]|$)' ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1'([[.semicolon.]]|$)'' at line 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兼容的正則表達式庫,該表達式沒有[[。.micmicolon。]]。使用PCRE庫上的MariaDB 10.0.5支持[[。微米]。]。 https://mariadb.com/kb/en/mariadb/regular-expressions-overview/

+0

謝謝朱利安!這是我所尋找的。它的工作原理: $ data = $ DB :: query(「SELECT * FROM items WHERE locations REGEXP'(^ |;)%d(; | $)'」,$ id); – user3588886 2015-04-14 05:05:32

相關問題