【问题标题】:Compare two sql tables比较两个sql表
【发布时间】: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)的函数来回答

标签: php mysql pdo


【解决方案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 数组。
猜你喜欢
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
  • 2017-11-01
  • 2010-11-27
  • 1970-01-01
相关资源
最近更新 更多