比较两个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,计算 stringword 之间的 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表的主要内容,如果未能解决你的问题,请参考以下文章

sql比对两个表中的差异数据比较的sql语句

比较两个sql表

通过比较两个表来更新 SQL 查询

sql如何比较两个表数据是不是一致

SQL BigQuery - 比较两个表的总计数

跨数据库和层比较 SQL Server 中的两个表