【问题标题】:Comparison of two tables in MYSQLMYSQL中两张表的比较
【发布时间】:2013-08-01 12:44:50
【问题描述】:

我有两张桌子。一个表 (table1) 有 28500 行,另一个 (table2) 有 17450 行。 我想比较这些表并查找 table1 中不存在的行。

SELECT * FROM table1 WHERE ID NOT IN (SELECT DISTINCT(ID) FROM table2)

有什么建议吗?

【问题讨论】:

  • 你能发布你的表结构吗?
  • 您的查询不起作用...
  • @ahmadalbayati OP 没有描述 OP 是否使用 PHP。
  • @Broken Heart 所以我可能不会在 PHP 中发布我可能的答案
  • 你确定两个表中都有这个ID吗?

标签: mysql database compare


【解决方案1】:

试试这个:

SELECT table1.*
FROM table1
LEFT OUTER JOIN table2
ON table1.id = table2.id
WHERE table2.id IS NULL

LEFT OUTER JOIN 链接从table1 开始的两个表,如果table2 没有链接行,table2 的所有字段都将为空。因此,如果您输入 WHERE 条件 table2.id 为空,您只会得到 table1 中不存在于 table2 中的行

【讨论】:

  • 这是什么意思 SELECT table1.*
  • table1的所有字段
  • 好吧,真该死。真的行!非常感谢!
【解决方案2】:

您可以通过执行左外连接并检查所有不存在的行来解决此问题。 根据您是要查找表 2 中的表 1 或表 1 中的表 2 中不存在的值,请尝试以下操作。

SELECT *
FROM table1
LEFT OUTER JOIN table2 ON (table1.id = table2.id)
WHERE table2.id IS NULL;


SELECT *
FROM table2
LEFT OUTER JOIN table1 ON (table1.id = table2.id)
WHERE table2.id IS NULL;

SQL 小提琴:http://sqlfiddle.com/#!2/a9390/8

【讨论】:

  • table2.id = NULL 不正确,比较字段与NULL值时请使用IS NULL
【解决方案3】:

利用这个查询:

SELECT 
    * 
FROM 
    table2 
LEFT JOIN 
    table1
ON 
    table2.primary_key = table1 .primary_key
WHERE 
    table1 .primary_key IS NULL
;

【讨论】:

    【解决方案4】:

    好吧,如果你想用 PHP 来回答,那么这里就是:

    $sql=mysql_query("SELECT * FROM table1");
    while($row=mysql_fetch_array($sql))
    {
        $id=$row['id'];
        $sql2=mysql_query("SELECT * FROM table2 WHERE id='$id'");
        $check=mysql_num_rows($sql2);
        if($check==0)
        {
            echo $id." is not in table1<br>";
        }
    }
    

    希望对你有帮助

    【讨论】:

    • 这是一种不好的方法,因为如果您在 table1 中有数千行,您将在运行 table2 查询时遍历每一行。效率极低
    • 是的。 5年前告诉我很多关于我的事:D
    • 哈哈……你说得对,回头看我之前写的代码我也有这种感觉。这意味着我们的技能正在提高;)
    • 是的,我们是 :-)
    【解决方案5】:

    如果您想按所有列比较 2 个表(完全比较,而不仅仅是按 ID 等单个特定列),您可以使用这种方法:

    SELECT column1, column2, column3
    FROM
     (
       SELECT t1.column1, t1.column2, t1.column3
       FROM t1
       UNION ALL
       SELECT t2.column1, t2.column2, t2.column3
       FROM t2
    )  t
    GROUP BY column1, column2, column3
    HAVING COUNT(*) = 1
    ORDER BY column3
    

    基于以下示例:http://www.mysqltutorial.org/compare-two-tables-to-find-unmatched-records-mysql.aspx

    【讨论】:

      【解决方案6】:
      SELECT * FROM table1
      where id not in (
          SELECT table2.id
          FROM table2
          LEFT OUTER JOIN table1
          ON (
              table1.id = table2.id 
              and table1.col1 = table2.col1 
              and table1.col2 = table2.col2
              ...
          )
      )
      

      table1 的行数比 table2

      【讨论】:

        猜你喜欢
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-18
        • 1970-01-01
        • 1970-01-01
        • 2013-03-03
        相关资源
        最近更新 更多