我有两个表,一个带有文本字符串,另一个带有单词。
如何获取表A中的每个字符串/行,并查看表A中表A中每个字符串包含多少个“单词” - 得到如下结果:
表A id:1包含表B中的2个单词(car,red) id:2包含来自表B的2个单词(house,hill) id:3包含来自表B的0个单词 id:4包含来自表B的2个单词(small,shoe)
答案 0 :(得分:0)
<?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!
答案 1 :(得分:0)
考虑在聚合查询中使用CROSS JOIN
的纯SQL解决方案,计算 string 和 word 之间的LIKE
个实例。下面使用条件SUM
聚合计算总数,并以逗号分隔列表中的GROUP_CONCAT
输出单词:
SELECT t1.id, SUM(CASE WHEN t1.string LIKE CONCAT('%', t2.words, '%')
THEN 1
ELSE 0
END) AS WordCount,
GROUP_CONCAT(CASE WHEN t1.string LIKE CONCAT('%', t2.words, '%')
THEN t2.words
ELSE NULL
END) AS Words
FROM Table1 t1
CROSS JOIN Table2 t2
GROUP BY t1.id
请参阅rextester demo。
警告:CROSS JOIN
可能会降低大型表的性能,因为笛卡尔积(所有可能的组合配对)在两个集之间运行,可以非常快速地运行到数百万个。