iT邦幫忙

0

MySQL SELECT IN 問題

chan15 2010-04-09 13:22:2413904 瀏覽

大家好,我今天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()裡面變成一個字串而非我設定的欄位
請問該怎樣才能達到我的目的呢?

10
賽門
iT邦超人 1 級 ‧ 2010-04-09 14:24:00
最佳解答

如果您的意思是, 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);

以上希望對您有幫助....如果需要完整的程式, 再留個話, 我再貼上來, 您先試試看囉...

chan15 iT邦新手 5 級 ‧ 2010-04-09 15:43:46 檢舉

我想只能用LIKE來解決…

賽門 iT邦超人 1 級 ‧ 2010-04-09 16:42:01 檢舉

chan15提到:
我想只能用LIKE來解決…

那問題就完全不同了....

10
灌籃高手
iT邦高手 1 級 ‧ 2010-04-09 14:17:35

看你的需求應該是用LIKE指令

8
fillano
iT邦超人 1 級 ‧ 2010-04-09 16:58:50

假如你要比較的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欄位時要先加工。

2
godstamp
iT邦新手 3 級 ‧ 2010-04-11 13:03:50

你是要使用 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)"
資料表的欄位名稱是數字?? 不管此種命名是否合法,在架構控管和維護上應該會帶來很多不便,特別是多人共同開發的環境上。

我要發表回答

立即登入回答