比较两个sql表
Posted
技术标签:
【中文标题】比较两个sql表【英文标题】:Compare two sql tables 【发布时间】:2018-02-25 18:16:19 【问题描述】:我有两张表,一张是文本字符串,一张是单词。
如何获取表 A 中的每个字符串/行,并查看表 A 中的每个字符串包含多少表 B 中的“单词” - 并获得如下结果:
表 A id: 1 包含表 B 中的 2 个单词(汽车、红色) id: 2 包含表 B 中的 2 个单词(house、hill) id: 3 包含表 B 中的 0 个单词 id: 4 包含来自表 B 的 2 个单词(小、鞋)
【问题讨论】:
是的,而且?你试过什么? 文本样本数据可能会有所帮助 加入表格,分离表格,导出数组,摆弄几个小时...... 这会很有趣;许多答案都是可能的,但它们很少是完全正确的。 (你有虐待狂的老师吗?) 这需要一个双循环,具有将字符串短语拆分为词根的功能。这不是一个简单的 mysql 查询。不过我喜欢这个问题。可以配合显示语言(如php)的函数来回答 【参考方案1】:<?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!
【讨论】:
我在哪里调用 sql 表? 我同意使用 PHP 让这个问题变得相对容易。【参考方案2】:考虑一个纯 SQL 解决方案,在聚合查询中使用 CROSS JOIN
,计算 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
可能会降低大型表的性能,因为笛卡尔积(所有可能的组合配对)在两个集合之间运行,可能会很快达到数百万。
【讨论】:
LIKE 不是很好的方法,因为如果字符串包含 fast and faster 并且 word 是 test 它会将其计为 1 这是错误的 这可能看起来是正确的方向。但是,我如何从您的示例获取结果表,如您的 rextester deme 示例中所示? 绝对正确@M Khalid Junaid ... OP 应该注意警告。我可能会使用完全相等的不同解决方案进行更新。 @CitronAutobot ...我不明白你的问题。这个解决方案 is 在演示中作为最后一个查询。前两个表格显示了复制的数据。 @Parfait - 以我有限的 mySQL/php 技能,我无法获得你得到的结果。我正在使用 PDO: $conn = new PDO("mysql:$host$db_name,$username,$password"); $sql = " (你的代码) "; $q = $conn->准备($sql); $q->执行(数组($title)); $q->setFetchMode(PDO::FETCH_BOTH); while($data = $q->fetch()) ??在这里做什么? 我做错了什么? 通过索引$data[0]
或列名$data['id']
在while
循环中简单地回显$data 数组。以上是关于比较两个sql表的主要内容,如果未能解决你的问题,请参考以下文章