Php 比较两个sql表
我有两个表,一个是文本字符串,另一个是单词 如何获取表A中的每个字符串/行,并查看表A中每个字符串包含的表B中的“单词”数量,并得到如下结果: 表APhp 比较两个sql表,php,mysql,pdo,Php,Mysql,Pdo,我有两个表,一个是文本字符串,另一个是单词 如何获取表A中的每个字符串/行,并查看表A中每个字符串包含的表B中的“单词”数量,并得到如下结果: 表A id:1包含表B中的两个单词(汽车、红色) id:2包含表B中的两个单词(房子、山) id:3包含表B中的0个单词 id:4包含表B中的2个单词(小的,鞋形的)考虑一个纯SQL解决方案,在聚合查询中使用交叉连接,计算字符串和单词之间的LIKE实例。下面使用有条件的SUM聚合计算总数,并使用GROUP\u CONCAT以逗号分隔的列表输出单词: &
id:1包含表B中的两个单词(汽车、红色)
id:2包含表B中的两个单词(房子、山)
id:3包含表B中的0个单词
id:4包含表B中的2个单词(小的,鞋形的)
考虑一个纯SQL解决方案,在聚合查询中使用交叉连接
,计算字符串和单词之间的LIKE
实例。下面使用有条件的SUM
聚合计算总数,并使用GROUP\u CONCAT
以逗号分隔的列表输出单词:
<?php
// Get $TableA from TableA and $TableB from Table B (std code)
$result = array();
foreach ($TableA as $id => $string) {
$result[$id] = array();
$words = explode(' ', $string);
foreach ($words as $word) {
if (in_array($word, $TableB)) {
$result[$id][] = $word;
}
}
}
// - display $result - left as exercise!
选择t1.id,SUM(t1.string-LIKE-CONCAT(“%”,t2.words,“%”时的大小写)
那么1
其他0
结束)作为字数,
组_CONCAT(t1.string-LIKE CONCAT(“%”,t2.words,“%”时的大小写)
然后是t2。单词
否则无效
(完)作为词语
来自表1 t1
交叉连接表2 t2
按t1.id分组
看
警告:交叉联接
可能会降低大型表的性能,因为笛卡尔乘积(所有可能的组合对)在两个集合之间运行,这两个集合可以非常快地运行数百万次。是,并且?您尝试过什么?可能文本示例数据将有助于连接表、分离表、导出数组,以及在周围摆弄数小时……这将是一件有趣的事情;许多答案是可能的,但它们很少是完全正确的。(你有虐待狂老师吗?)这需要一个双循环,带有一个将字符串短语分割成词根的函数。这不是一个简单的MySQL查询。我喜欢这个问题。可以通过与显示语言(如PHP)结合使用的函数来回答我同意使用PHP可以相对容易地解决这个问题。LIKE不是解决这个问题的好方法,因为如果字符串包含fast和faster,并且word是test,那么它会将其计为1,这是错误的,这看起来可能是正确的方向。但是,我如何从您的示例中获得结果表,如您的rextester deme示例中所示?绝对正确@M Khalid Junaid。。。OP应该注意这个警告。我可以使用完全相等的不同解决方案进行更新@柠檬酸机器人。。。我不明白你的问题。此解决方案作为最后一个查询在演示中。前两个表显示了复制的数据。@Parfait-由于我有限的mySQL/php技能,我无法获得您得到的结果。我正在使用PDO:$conn=newPDO(“mysql:$host$db_name,$username,$password”);$sql=“(您的代码)”$q=$conn->prepare($sql)$q->execute(数组($title))$q->setFetchMode(PDO::FETCH_二者);while($data=$q->fetch()){??在这里做什么?}我做错了什么?只需通过索引、$data[0]
或列名、$data['id']
在while
循环中回显$data数组即可。