大家好,我今天table有一個欄位是存放用,組成的字串 例:1,2,3
目的是想要用IN來篩選內容,假設欄位名稱叫做xyz好了
$val = 1;
$query = sprintf("SELECT * FROM table WHERE %s IN (xyz)", $val);
可是我printf $query的結果會變成
"SELECT * FROM table WHERE 1 IN (xyz)"
xyz在IN()裡面變成一個字串而非我設定的欄位
請問該怎樣才能達到我的目的呢?
如果您的意思是, XYZ為資料表T1的一個欄位, 您希望
$query = sprintf("SELECT * FROM table WHERE %s IN (xyz)", $val);
的結果是
SELECT * FROM table WHRE 1 IN (0, 1, 2, 3, 4)
假如T1中XYZ欄位的內容有0, 1, 2, 3, 4
如果您是希望得到這樣的結果,
可能需要改變做法, 因為在MySQL中不會自動把XYZ位內容列出...只能透過SQL Statement的執行把資料撈出來, 我把我的想法寫出來, 具體的程式仍由您來自己撰寫看看...
$val = 1;
$xyz = "";
建立一個CURSOR, 其內容來源為SELECT XYZ FROM T1
利用REPEAT....UNTIL建立LOOP
在LOOP中用FETCH指令取得CURSOR中的每一個XYZ值, 再放到放到字串$xyz中
$xyz = $xyz + ", " + CURSOR.XYZ
最後...
$query = sprintf("SELECT * FROM table WHERE %s IN (%s)", $val, $xyz);
以上希望對您有幫助....如果需要完整的程式, 再留個話, 我再貼上來, 您先試試看囉...
假如你要比較的xyz欄位內容可以改成regular expression的pattern,那可以這樣做:
例如xyz的值是'[1,2,3,4,5]'...
<pre class="c" name="code">
$val = 1;
$query = sprintf("SELECT * FROM table WHERE %s REGEXP (xyz)", $val);
只是在把東西存進xyz欄位時要先加工。
你是要使用 A資料表 中的 B欄位值 當查詢條件來取得 A資料表 的資料嗎?
這種做法的用意何在呢?
你有使用printf 在php中處理字串,這樣的話,何不將 1,2,3 ... 這些資料存放到另一資料表
先取出後再於 printf 一併處理完整後再交由 MySQL 處理。
或者你是希望一句MySQL語法處理完這些動作,一樣是可以透過另一個資料表來完成
例如 SELECT * FROM 資料表A WHERE 欄位 IN (SELECT * FROM 資料表B WHERE ...)
附帶一提...
你這句讓我覺得怪怪的... "SELECT * FROM table WHERE 1 IN (xyz)"
資料表的欄位名稱是數字?? 不管此種命名是否合法,在架構控管和維護上應該會帶來很多不便,特別是多人共同開發的環境上。