2013-06-23 38 views
0

好了,有很多事情在我這裏這麼裸...MySQL的:使用搜索結果(如%搜索%),匹配ID在另一個數據庫中的表

我在數據庫中有兩個表,零件和產品, 我在產品表中有一列有id字符串(逗號分隔)的字符串,這些id是parts表的匹配id。

**parts** 

ID | description (I'm searching this part) 
------------------------------- 
1 | some text here 
2 | some different text here 
3 | ect... 

**products** 

ID | parts-list 
-------------------------------- 
1 | 1,2,3 
2 | 2,3 
3 | 1,2 

我真的很苦惱這個SQL查詢。 我已經做了第1部分,得到了ID的從零件表

SELECT * FROM parts WHERE description LIKE「%{$搜索}%」

最大的問題是對的逗號分隔結構描述欄。

很明顯,我可以在PHP中做到這一點,從部件表創建一個結果數組,使用它來搜索產品表中的id,然後使用這些結果從部件表中獲取行數據(再次)。效率不高。

我也試過這個,但我顯然想在這裏比較兩個數組,不知道應該怎麼做。

SELECT * FROM `products` WHERE 
CONCAT(',', description, ',') 
IN (SELECT `id` FROM `parts` WHERE `description` LIKE '%{$search}%') 

任何人都可以幫忙嗎?

謝謝。

+1

你應該重構你的數據庫引入一個名爲product_part的表並且有2列product_id,part_id。並擺脫逗號分隔的字段效率低下。 – DevZer0

+1

要添加到DevZer0所說的內容,您要查找的術語是「多對多」或「聯結」表。 [查看](http://en.wikipedia.org/wiki/Junction_table) - 這絕對是你想要在這裏做的。 – mpen

+0

假設這不是一個選項。每個產品都有多個部分,每個部分都與多個產品一起使用,每個部分的數量各不相同。我可以保持這種關係的唯一方法是使用上面的方法。 –

回答

0

我也許會嘗試組合LOCATE()SUBSTR()。我主要在MSSQL中工作,其中有CHARINDEX(),我認爲它的工作原理類似於MySQL的LOCATE()。它一定是凌亂的。零件列表字段中是否有可變數量的元素?

+0

是的,每個都有不同數量。基本上,結構是這樣設置的,即零件表保存所有信息,而產品表僅用於在顯示頁面時整理數據。我需要的是一個搜索功能,它將在零件表中搜索匹配的結果,參考parts-list列中包含這些零件的產品,並返回每個產品的行數據。 –

+0

也許給這個看看。 http://stackoverflow.com/questions/7737970/procedure-to-loop-through-comma-separated-string-is-not-working – Tony

相關問題