将mysql数据库行查找到字符串数组php中
Posted
技术标签:
【中文标题】将mysql数据库行查找到字符串数组php中【英文标题】:Find a mysql database row into a string array php 【发布时间】:2016-11-19 20:48:42 【问题描述】:我有一个类似的mysql数据库
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')
)
如果只有 'what' 列匹配,则只返回那个。我还有一个单独的表格,其中包含什么列。 现在,我在 mysql 中使用正则表达式:
"SELECT * FROM table WHERE '$string' REGEXP what AND '$string' REGEXP name LIMIT 1"
这确实有效(如果只有“what”或“name”匹配,则不正确,但这不太重要),但我的网站变得非常慢,因为我必须每次同时运行大约 15 个这样的搜索,对于每个脚本,字符串数组大小约为 15 个条目,因此同时总共有大约 225 个匹配项(和查询),数据库大小约为 1200 行... 我的想法是获取脚本开头的所有行(“SELECT * FROM table”),然后循环结果,对于每个循环,我循环字符串数组,如果匹配,我得到一个结果。这对数据库来说问题较少,因为每个脚本只有 1 个查询,但无论如何我都会循环 15*1100 匹配,这对服务器来说是相当多的工作...... 最后一个想法是将所有行存储在一个多维数组中,例如
$rows = array('fruit' => array(row0,row1,row2), 'vegetable'=>(row3,row4));
然后循环行以匹配键('fruit','vegetable'),如果匹配,则循环该数组(水果匹配,因此我循环 row0,row1,row2) 您对如何获得我想要的结果有不同的想法吗?更有效的匹配方式? 我还想将查询结果存储到内存中,以便我可以在脚本之间获取它(当我同时运行脚本 15 次时,我希望能够进行单个 mysql 查询来获取结果和在脚本之间共享)。我怎样才能做到这一点?我正在寻找 mysql 查询缓存...还有什么? 非常感谢
【问题讨论】:
【参考方案1】:我的英语很糟糕!但我理解你的问题。
为什么要在实时请求中将字符串 $response
与 DB 匹配?如果没有必要,我认为您需要制作一个表格来保存响应,然后通过 crontab 进行处理,为其创建循环。按顺序处理会更好。
如果真的需要实时匹配响应,我认为您的系统需要许多进程(通过 java、nodejs 等...和多线程)来解决这个问题。只有 php & MySQL 不能做更多你想做的事情。
** 更新:最后一个问题的解决方案还不错。我知道问题后立即想到了,但我不确定您的真正需求。
【讨论】:
我让客户提供输入,在不同的网站上搜索输入(每个网站都在不同的脚本上搜索以获得异步响应),然后响应与数据库匹配以链接每个响应包含额外信息的数据库行(在我的示例中是颜色、重量等)以及与其他表的逻辑连接。我希望网站响应后立即向客户端显示所有这些信息,因此我需要实时匹配,唯一的方法是通过字符串匹配。【参考方案2】:希望你不要忘记给 What 和 Name 列添加索引,你会得到巨大的性能影响
ALTER TABLE table ADD UNIQUE unique_index(What, Name);
仅举几个替代方案。看这个问题Search for occurence of any stored words within a sentence (MySQL)
SELECT *, SUM('$string' LIKE CONCAT('%', What, '%')) as what, SUM('$string' LIKE CONCAT('%', Name, '%')) as表中的名称;
或者,将字符串预处理为逗号分隔
$string = implode(",", $string);
然后
SELECT * FROM searh WHERE What IN ($string) and Name in ($string) LIMIT 1;
不确定哪个速度更快,至少 index 会有多大帮助
【讨论】:
【参考方案3】:对不起,我喝了一点,但解决办法似乎是:
-
您有一个具有以下属性/字段的表:ID |什么|名称 - 我将其命名为 veggiesNfruits(名称有点烂),但您有一个不同的表名(只需在下面输入)。
您应该执行一条 SQL DDL 语句:
alter table veggiesNfruits add tasteDescription varchar(255);
接下来您应该执行一条 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
避免使用select * from blaBlahblah
——这纯粹是邪恶的,会影响性能(尽管我假设在这种情况下你需要所有的字段,这就是'star'的原因,而不是使用select [field1], [field2] 来自 ...)
最终,我认为您应该阅读有关数据库/表格的信息,而这些表格可能有以下表格:
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');
【讨论】:
我的英语不好,事实上你不明白我在找什么。我想与数据库匹配的字符串数组是对网站的 http 调用的结果,它可能会改变,我无法控制它。并且匹配可以在同一行发生多次。例如,如果数组是(香蕉是一种好水果,我喜欢吃水果和香蕉),那么两个元素都应该匹配 dame 行(水果,香蕉)。以上是关于将mysql数据库行查找到字符串数组php中的主要内容,如果未能解决你的问题,请参考以下文章
如何让php中通过字段和记录查询得到的mysql返回数据保持原有的数据类型
php怎么将mysql查询的数组中 的(数字)字符串类型转为数字类型