2016-07-16 37 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;

不确定哪一个会更快至少索引会有多大帮助