作者 主題: 多重比對之SQL語法問題…  (閱讀 18153 次)

0 會員 與 1 訪客 正在閱讀本文。

akou

  • 懷疑的國中生
  • **
  • 文章數: 38
    • 檢視個人資料
多重比對之SQL語法問題…
« 於: 2007-05-29 23:05 »
各位好

我現在在寫一個簡單的搜尋程式

搜尋自己的MYSQL資料庫

原本是很簡單

只搜尋一個欄位

現在被要求就是可以讓使用者只輸入一個關鍵字

然後要可以多重比對資料表的數個欄位

若是原本寫法

WHERE ip_email = colname

那麼應該做些什麼改變,才可以讓這個頁面部只是只有去比對ip_email

而是還可以跟其他欄位一同比對?

謝謝!!

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
多重比對之SQL語法問題…
« 回覆 #1 於: 2007-05-29 23:41 »
用 or xxxx = colname 多設定幾個 不就好了...
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

akou

  • 懷疑的國中生
  • **
  • 文章數: 38
    • 檢視個人資料
多重比對之SQL語法問題…
« 回覆 #2 於: 2007-05-29 23:54 »
引述: "Darkhero"
用 or xxxx = colname 多設定幾個 不就好了...


您好~

也就是說 沒辦法

xxx,XXX,XXX =colname

這樣直接寫不行囉?

一定要有or 是嗎?

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
多重比對之SQL語法問題…
« 回覆 #3 於: 2007-05-30 00:01 »
引述: "akou"
引述: "Darkhero"
用 or xxxx = colname 多設定幾個 不就好了...


您好~

也就是說 沒辦法

xxx,XXX,XXX =colname

這樣直接寫不行囉?

一定要有or 是嗎?


你可以去查文件,不過目前應該各家都沒有你要的這種語法...

----
現在人查個文件有這麼難嗎?
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1693
    • 檢視個人資料
多重比對之SQL語法問題…
« 回覆 #4 於: 2007-05-30 11:43 »
引述: "akou"

xxx,XXX,XXX =colname



Mysql 用  where in

Table test_string

+----+-----------+-----------+
| id | char1     | char213   |
+----+-----------+-----------+
|  8 | 2,3,5     | 2,3,5     |
|  9 | 1234      | 1234      |
| 10 | 1234      | 1234      |
| 11 | 1234      | 1234      |
| 12 | 1234      | 1234      |
+----+-----------+-----------+

SELECT *
FROM `test_string`  where '1234' in (id,char1,char213)

自己試試

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
多重比對之SQL語法問題…
« 回覆 #5 於: 2007-05-30 13:21 »
嗯, 原來 where in 還可以這樣用..


在單純的等於搜尋是可以, 如果要用 like 的話就破功了..

找了一下 mysql 的網站, 沒看到有這種用法的說明  :roll:

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1693
    • 檢視個人資料
多重比對之SQL語法問題…
« 回覆 #6 於: 2007-05-30 15:22 »
引述: "yamaka"
嗯, 原來 where in 還可以這樣用..


在單純的等於搜尋是可以, 如果要用 like 的話就破功了..

找了一下 mysql 的網站, 沒看到有這種用法的說明  :roll:


是的!這where in 有一定限制....

+----+-----------+-----------+
| id | char1     | char213   |
+----+-----------+-----------+
|  1 | 1,2,3,4,5 | 1,2,3,4,5 |
|  2 | 1,2       | 1,2       |
|  3 | 12341234  | 12341234  |
|  4 | 2,4,5     | 2,4,5     |
|  5 | 2,5       | 2,5       |
|  6 | 3,4       | 3,4       |
+----+-----------+-----------+

SELECT *
FROM `test_string` where 1 in (id,char1,char213)
試試...如果欄位中的資料 是 (1,2,3,4,5) 這種的.....
破功  :lol:

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1693
    • 檢視個人資料
多重比對之SQL語法問題…
« 回覆 #7 於: 2007-05-30 15:40 »
引述: "yamaka"
嗯, 原來 where in 還可以這樣用..


在單純的等於搜尋是可以, 如果要用 like 的話就破功了..

找了一下 mysql 的網站, 沒看到有這種用法的說明  :roll:


要 like ,mysql也有其他用法

以下用法太 evil 小孩及新手不宜
----------------------

+----+-----------+-----------+
| id | char1     | char213   |
+----+-----------+-----------+
|  1 | 1,2,3,4,5 | 1,2,3,4,5 |
|  2 | 1,2       | 1,2       |
|  3 | 12341234  | 12341234  |
|  4 | 2,4,5     | 2,4,5     |
+----+-----------+-----------+

SELECT *
FROM `test_string` where instr(concat(id,char1,char213),1) > 0

wilson

  • 俺是博士!
  • *****
  • 文章數: 1821
  • 帥氣柴老大
    • 檢視個人資料
多重比對之SQL語法問題…
« 回覆 #8 於: 2007-05-30 16:26 »
以performace來講的話, DB2這邊用where id = '1' or id ='2' or id ='3'會優於where id in (1,2,3).

不知道MySQL是否也是如此?
當然可能也考慮一下量大不大? 小量資料的話或許沒感覺, 就選方便寫的吧.

akou

  • 懷疑的國中生
  • **
  • 文章數: 38
    • 檢視個人資料
多重比對之SQL語法問題…
« 回覆 #9 於: 2007-05-30 16:32 »
哎呀!

感謝micmic3大哥啊

順利完成這段囉@@

這種寫法 比寫一堆like還有or簡單多了

誠心的感謝您啊!!!

一同感謝這篇文章 給小弟建議的板友

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
多重比對之SQL語法問題…
« 回覆 #10 於: 2007-05-30 17:26 »
引述: "wilson"
以performace來講的話, DB2這邊用where id = '1' or id ='2' or id ='3'會優於where id in (1,2,3).

不知道MySQL是否也是如此?
當然可能也考慮一下量大不大? 小量資料的話或許沒感覺, 就選方便寫的吧.


看樣子要實際上跑資料庫的分析結果才會知道....
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
多重比對之SQL語法問題…
« 回覆 #11 於: 2007-05-30 17:28 »
引述: "micmic3"
引述: "yamaka"
嗯, 原來 where in 還可以這樣用..


在單純的等於搜尋是可以, 如果要用 like 的話就破功了..

找了一下 mysql 的網站, 沒看到有這種用法的說明  :roll:


要 like ,mysql也有其他用法

以下用法太 evil 小孩及新手不宜
----------------------

+----+-----------+-----------+
| id | char1     | char213   |
+----+-----------+-----------+
|  1 | 1,2,3,4,5 | 1,2,3,4,5 |
|  2 | 1,2       | 1,2       |
|  3 | 12341234  | 12341234  |
|  4 | 2,4,5     | 2,4,5     |
+----+-----------+-----------+

SELECT *
FROM `test_string` where instr(concat(id,char1,char213),1) > 0


這寫法真的是邪惡到不行...=_=...
簡單的說,就是全部欄位搞成一個字串...然後檢單我們要查的內容有沒有出現在該字串中....
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1693
    • 檢視個人資料
多重比對之SQL語法問題…
« 回覆 #12 於: 2007-05-30 18:38 »
同樣 php 如果要 if( $a='a' or $b='a' or $c='a')

可以用  if(in_array('a',array($a,$b,$c)))

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
多重比對之SQL語法問題…
« 回覆 #13 於: 2007-05-30 21:42 »
引述: "micmic3"
同樣 php 如果要 if( $a='a' or $b='a' or $c='a')

可以用  if(in_array('a',array($a,$b,$c)))



嗯嗯~~

所以說, 熟悉程式語言的特性的話, 加上一些創造力,

同樣的功能可以用不同方式表達, 就看自己如何運用了~~

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
多重比對之SQL語法問題…
« 回覆 #14 於: 2007-05-30 23:02 »
引述: "yamaka"
引述: "micmic3"
同樣 php 如果要 if( $a='a' or $b='a' or $c='a')

可以用  if(in_array('a',array($a,$b,$c)))



嗯嗯~~

所以說, 熟悉程式語言的特性的話, 加上一些創造力,

同樣的功能可以用不同方式表達, 就看自己如何運用了~~


是阿..程式的變化很大,一個想法的轉彎可能就可以做出完全不一樣的程式碼唷..
這也是寫程式好玩的地方..^_^.
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

oscars80

  • 憂鬱的高中生
  • ***
  • 文章數: 92
    • 檢視個人資料
多重比對之SQL語法問題…
« 回覆 #15 於: 2007-05-31 11:17 »
引述: "micmic3"
引述: "yamaka"
嗯, 原來 where in 還可以這樣用..


在單純的等於搜尋是可以, 如果要用 like 的話就破功了..

找了一下 mysql 的網站, 沒看到有這種用法的說明  :roll:


要 like ,mysql也有其他用法

以下用法太 evil 小孩及新手不宜
----------------------

+----+-----------+-----------+
| id | char1     | char213   |
+----+-----------+-----------+
|  1 | 1,2,3,4,5 | 1,2,3,4,5 |
|  2 | 1,2       | 1,2       |
|  3 | 12341234  | 12341234  |
|  4 | 2,4,5     | 2,4,5     |
+----+-----------+-----------+

SELECT *
FROM `test_string` where instr(concat(id,char1,char213),1) > 0


邪惡用法有限制歐,只能用在單數(0~9),
因為這裡是用concat,如果兩位數以上有可能會抓錯XD

我自己還是比較喜歡用程式判別,比較保險XD

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
多重比對之SQL語法問題…
« 回覆 #16 於: 2007-05-31 16:14 »
引述: "oscars80"
引述: "micmic3"
引述: "yamaka"
嗯, 原來 where in 還可以這樣用..


在單純的等於搜尋是可以, 如果要用 like 的話就破功了..

找了一下 mysql 的網站, 沒看到有這種用法的說明  :roll:


要 like ,mysql也有其他用法

以下用法太 evil 小孩及新手不宜
----------------------

+----+-----------+-----------+
| id | char1     | char213   |
+----+-----------+-----------+
|  1 | 1,2,3,4,5 | 1,2,3,4,5 |
|  2 | 1,2       | 1,2       |
|  3 | 12341234  | 12341234  |
|  4 | 2,4,5     | 2,4,5     |
+----+-----------+-----------+

SELECT *
FROM `test_string` where instr(concat(id,char1,char213),1) > 0


邪惡用法有限制歐,只能用在單數(0~9),
因為這裡是用concat,如果兩位數以上有可能會抓錯XD

我自己還是比較喜歡用程式判別,比較保險XD


我是習慣讓程式自己去產生那一段SQL....
可以保有兩邊的彈性.. :D
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
多重比對之SQL語法問題…
« 回覆 #17 於: 2007-05-31 17:03 »
是啊~~是啊~~~

邪惡的方式偶爾用一下無傷大雅啦..

善良的小老百姓還是用一般的方式就好  :wink:

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1693
    • 檢視個人資料
多重比對之SQL語法問題…
« 回覆 #18 於: 2007-05-31 17:10 »
引述: "oscars80"

邪惡用法有限制歐,只能用在單數(0~9),
因為這裡是用concat,如果兩位數以上有可能會抓錯XD

我自己還是比較喜歡用程式判別,比較保險XD

應該也還好
我們會下  a like '%b%' 是因為 b 比較短
12 like '%1%' 是一定會成立的...沒有兩位數的問題
反而有問題會在 字串相接的地方

21 !like '%12%' and 24 !like '%12%'
但合在一起 2124 like '%12%' 成立.........

而且 like '_12_' 不適用....

所以小孩和新手不宜.....在沒有了解基礎時...還是用普通的方法
因為新手沒辦法看到 技巧 背後的原理與陷阱
---
另外說一下 in_array 的好處
當有一堆 or 的條件時...if ( ()||()||.......)
會又看的頭疼.....這時用 in_array 可以避掉這個問題...
日後要在後面增減條件也容易

湯姆貓

  • 活潑的大學生
  • ***
  • 文章數: 475
    • 檢視個人資料
多重比對之SQL語法問題…
« 回覆 #19 於: 2007-05-31 18:08 »
如果資料欄位中真的要存這種
1,2,3,4,11,12,13,14
資料的話....
我會用
"1","2","3","4","11","12","13","14"
然後找資料就用
"1"去找

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
多重比對之SQL語法問題…
« 回覆 #20 於: 2007-05-31 19:17 »
引述: "湯姆貓"
如果資料欄位中真的要存這種
1,2,3,4,11,12,13,14
資料的話....
我會用
"1","2","3","4","11","12","13","14"
然後找資料就用
"1"去找


這樣的話, 不如前後各多加一個逗號就好,

可以達到效果, 又不會增加資料量..

如果將來需要 explode, 也不會太麻煩..

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
多重比對之SQL語法問題…
« 回覆 #21 於: 2007-05-31 19:31 »
用這個就好了....
代碼: [選擇]
function create_where_str($columns,$needle){
    $return_str = '';
    foreach($columns as $val){
        $return_str[] = "{$val} like '%$needle%' ";
    }
    return implode(' or ',$return_str);
}


sample :
代碼: [選擇]
$query_str = 'abc';
$columns = array('id','name','username','address');
$sql = "Select * from myTable where ";
$sql .= create_where_str($columns,$query_str);
mysql_query($sql);


當然若不管資料表怎樣,都要搜索全部欄位的話,搭配 show columns from {$table} 就好了
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/