2016-07-16 38 views
1

我有一個MySQL數據庫像查找mysql數據庫一行到字符串數組PHP

Id | What | Name 
------------ 
0 | fruit | apple 
1 | fruit | banana 
2 | fruit | orange 
3 | vegetable | onion 
4 | vegetable | bean 
... 

我查詢一個網站,我解析響應到一個數組:

$response = array(
0 => 'Apple is a very good fruit', 
1 => 'I like vegetables, onion is my favorite', 
2 => 'I eat an orange every morning, fruit i good for your health' 
3 => 'I hate vegetables', 
4 => 'I love banana!' 
) 

我想匹配用正確的行到數據庫中的數組中的每個字符串,在這種情況下,這將是:

$response_matched = (
0 => Array('id' => 0, 'what' => 'fruit', 'name' => 'apple'), 
1 => Array('id' => 1, 'what' => 'vegetable', 'name' => 'onion'), 
2 => Array('id' => 2, 'what' => 'fruit', 'name' => 'orange'), 
3 => Array('id' => -1, 'what' => 'vegetable', 'name' => 'undefined'), 
4 => Array('id' => 4, 'what' => 'fruit', 'name' => 'apple') 
) 

如果只有「什麼」柱墊ch,然後返回。我也有一個單獨的表,只有哪一列。現在 ,我使用MySQL的正則表達式:

"SELECT * FROM table WHERE '$string' REGEXP what AND '$string' REGEXP name LIMIT 1" 

這實際上工作(不正確如果只是「什麼」或「名字」匹配,但這是不太重要的),但我的網站變得很慢,因爲我每次必須同時運行約15個這樣的搜索,並且對於每個腳本來說,字符串數組的大小約爲15個條目,因此總共大約225個匹配(和查詢)在同一時間,數據庫大小約爲1200行... 我的想法是獲取腳本開始處的所有行(「SELECT * FROM table」),然後循環結果和每個循環,我循環字符串數組,如果匹配,我得到一個結果。這對於數據庫來說會少一些問題,因爲每個腳本只有一個查詢,但是我仍然會在15 * 1100的循環中循環,這對服務器來說是相當有用的... 最後一個想法是獲取存儲在像

$rows = array('fruit' => array(row0,row1,row2), 'vegetable'=>(row3,row4)); 

一個多維陣列。然後循環的行以匹配密鑰(「果實」,「蔬菜」),並且如果它接着匹配我回路陣列(果匹配,因此我環ROW0,ROW1,ROW2 ) 對於如何獲得我想要的結果,您有不同的想法嗎?一種更有效的匹配方式? 我也想將查詢結果存儲到內存中,這樣我就可以在腳本之間獲得它(當我同時運行腳本15次時,我希望能夠通過單個mysql查詢來獲得結果並在腳本之間共享)。我怎樣才能做到這一點?我正在尋找MySQL查詢緩存...還有什麼? 非常感謝您

回答

0

對不起,我喝了一下,但解決方案似乎是:

  1. 你必須具有以下屬性/字段的表:ID |什麼|名字 - 我會稱之爲veggiesNfruits(名字很爛),但你有一個不同的表名稱(下面只是輸入它)。
  2. 你應該執行一個SQL DDL語句:

    ALTER TABLE veggiesNfruits添加tasteDescription VARCHAR(255);

  3. 接下來,您應該執行一個SQL DML語句:

    truncate table veggiesNfruits; -- this will delete all records from a table insert into veggiesNfruits (What, Name, tasteDescription) values ('fruit', 'apple', 'Apple is a very good frui'), ('fruit', 'banana', 'Bananas are for pussys') /*...rest of fruits n veggies with descriptions */; -- this will insert your records + description

  4. 避免使用select * from blaBlahblah - 這是純粹的邪惡和影響parformance(雖然我認爲在這種情況下,你需要的所有領域和這是'明星'的原因,而是使用select [field1],[field2] from ...)

  5. 將SQL結果加載到數組,不查找/加入素描/水果,只是打印/輸出數組[「描述」]。 希望它有幫助。

最後,我認爲你應該閱讀有關數據庫/表德興的可能有如下表代替:

create table plants(veg_id int primary key, veg_name varchar(255), veg_pln_id int references plant_types(pln_id)); -- maybe also veg_description

create table plant_types(pln_id int primary key, pln_description varchar(255); insert into plant_types(pln_description) values('fruit'), ('vegetable'); insert into plants(veg_name, veg_pln_id) values('apple', 1), ('onion', 2); insert into plants(veg_name, veg_pln_id) values ('bean',select pln_id from plant_types where pln_description='vegtable');

+0

我的英語不好,其實你不明白我在找什麼。我想與數據庫匹配的字符串數組是網站http調用的結果,可能會改變,我無法控制它。匹配可以發生在同一行多次。例如,如果數組是(香蕉是一種很好的水果,我喜歡吃水果和香蕉),那麼這兩個元素應該匹配聖母院(水果,香蕉)。 –

0

我的英語不好!但我明白你的問題。

爲什麼要在實時請求中將字符串$response與數據庫匹配?如果沒有必要,我認爲你需要創建一個表來保存響應,然後通過crontab創建進程,爲它創建循環。按順序處理它,那會更好。

如果真的有必要實時匹配響應,我認爲你的系統需要很多進程(通過java,nodejs等...和多線程)來解決這個問題。只有PHP & MySQL不能做更多你想要的事情。

**更新:最後一個問題的解決方案並不錯。當我知道這個問題後,我馬上想到了它,但我不確定你的真正需求。

+0

我有客戶端提供輸入,在不同的網站上搜索輸入(每個網站在不同的腳本上搜索以獲得異步響應),而不是響應與數據庫匹配,以便將每個響應與包含數據庫行額外的信息(在我的例子中是顏色,重量等)以及與其他表格的邏輯連接。我希望所有這些信息在網站響應後儘快顯示給客戶端,所以我需要實時匹配,唯一的方法就是通過字符串匹配。 –

0

我希望你沒有忘記添加索引到什麼和名稱列,您將獲得巨大的性能影響

ALTER TABLE表中添加UNIQUE unique_index(什麼,名稱);

只是爲了舉個例子。看看這個問題Search for occurence of any stored words within a sentence (MySQL)

SELECT *,SUM('$ string'LIKE CONCAT('%',What,'%'))as what,SUM('$ string'LIKE CONCAT('%',Name, '%'))作爲表名;

,或者預處理串入逗號分隔

$字符串=破滅( 「」,$字符串);

然後

SELECT * FROM searh WHERE什麼(​​$字符串)和名稱($字符串)LIMIT 1;

不確定哪一個會更快至少索引會有多大幫助