2013-03-11 117 views
0

我有一個手錶在線商店。它有一個搜索過濾器。過濾的一個標準是手錶的材質。它有很多獨特的價值。例如:「鋼」,「有金的鋼」,「有鍍金的鋼」。麻煩在邏輯與mysql

我試圖通過創建一個SQL LIKE請求過濾手錶與鋼身體,金身體過濾手錶。但是,當搜索帶有金色機身的手錶時,它也給了我帶有鍍金的鋼質手錶,因爲它包含「黃金」一詞。

你能提出一個很好的解決方案來解決這個問題嗎?

到目前爲止,我試過這條SQL語句:

SELECT * FROM `watches` WHERE `material` LIKE "%gold%" 
+2

你可以請張貼你的代碼嗎?你試過什麼了? – Barranka 2013-03-11 22:35:25

+0

使用sphinx_search,創建一個名爲filters的表。將所有功能/過濾器插入此表中,並將其映射到各自的watch_id。索引這張表,你現在擁有所有的控制權。如果我不清楚,谷歌sphinx_search,它解決了這一切 – beck03076 2013-03-11 22:41:19

回答

2

如果我這樣做,我會創建一個名爲「Material」的表併爲每個可用材料添加一條記錄,然後將材質ID存儲在watches表中而不是文字中。 (有許多的原因,這是更好的。)

材質表:

id - Material 
1 - Gold 
2 - Gold Plated 
3 - Silver 
4 - Steel with Gold 

然後在你的搜索中,您將允許用戶選擇他們感興趣的材料和您的SQL看起來是這樣的這個:

Select * from Watches where Material IN (1,4); 

這會帶來一個手錶是由黃金或鋼與金製成。你的搜索會更快。

0
$criterium = "gold"; 
$query = mysql_query("SELECT * FROM watches WHERE material = '$criterium'"); 

應該解決您的問題。同時檢查SQL LIKE條件以進一步查詢

+1

這不會像你所擁有的那樣工作。 'LIKE'在字符串中需要通配符('%'符號),否則就和使用equals相同。另外,'LIKE'查詢非常慢 - 謹慎使用它們;如果你的數據庫很大,你需要一個替代解決方案。 – Spudley 2013-03-11 23:00:15

+0

哦,我不知道他們很慢。我所理解的,他需要比較確切的單詞,所以等於(=)應該可以正常工作。 – Mollo 2013-03-11 23:04:57