php mysql两表比较不存在数据,怎么返回缺失的数据?

https://blog.csdn.net/loliDapao/article/details/117418922
我是根据这篇文章的代码练习的,但是遇到一个问题
按照文中的方法二,使用左联查询后,
得到返回结果集是B表的
B.ID === > null 1274 null
这结果不是我想要的那种,我想返回结果集是A表的在B表缺少的数据
如下:
A.ID ===> 616 555
请教各位指点一下,谢谢。

参考GPT:这个 SQL 查询语句中,左联结 A 表和 B 表,使用 ON 子句将 A 表和 B 表连接起来。然后,WHERE 子句的条件是 B 表的 ID 列为空值。因为我们是左联结,所以该查询语句将返回 A 表中在 B 表缺少的数据,也就是你想要的结果。

你可以尝试将这个查询语句用于你的 PHP 代码中,并将结果存储在一个数组中。以下是示例代码:

// 连接数据库
$conn = mysqli_connect("localhost", "username", "password", "database_name");

// 查询数据
$sql = "SELECT A.ID FROM A LEFT JOIN B ON A.ID = B.ID WHERE B.ID IS NULL";
$result = mysqli_query($conn, $sql);

// 将结果存储在数组中
$data = array();
while ($row = mysqli_fetch_array($result)) {
    $data[] = $row['ID'];
}

// 输出结果
print_r($data);


你需要将 localhost、username、password 和 database_name 替换为你的 MySQL 数据库的实际值。另外,上述示例代码中使用的是 MySQLi 扩展,如果你使用的是不同的 PHP 数据库扩展,你可能需要修改一些代码。

参考GPT和自己的思路:据您的问题描述,您想要返回在 A 表中存在而在 B 表中不存在的数据。可以通过使用子查询和 NOT IN 子句来实现。具体操作如下:

SELECT A.ID FROM A 
WHERE A.ID NOT IN 
    (SELECT B.ID FROM B)

这将查询在 A 表中存在,但在 B 表中不存在的 ID。您可以根据需要添加其他字段。希望能对您有所帮助。

该回答引用于gpt与OKX安生共同编写:
  • 该回答引用于gpt与OKX安生共同编写:

要返回A表中在B表缺少的数据,可以使用反向左连接(left join...where is null)。

具体来说,可以先根据A表和B表的关联字段进行左连接(left join),然后通过where子句过滤出B表中不存在的记录,即B表中对应字段为null的记录。最后选择出A表中对应的记录即可。

以下是示例代码:

SELECT A.ID FROM A
LEFT JOIN B ON A.ID = B.ID
WHERE B.ID IS NULL;

在上述代码中,A和B分别表示两个表的名称,ID为它们之间的关联字段。该语句会返回在A表中存在但在B表中缺失的记录的ID值。

如果您想要返回完整的A表记录而不仅仅是ID值,只需将查询语句中的 "SELECT A.ID" 更改为 "SELECT A.*" 即可。

希望这可以帮助到您。

在PHP中,可以通过MySQL的LEFT JOIN操作来比较两个表中缺失的数据。具体步骤如下:

  1. 编写SQL查询语句,使用LEFT JOIN将两个表连接起来,并根据需要进行筛选。

例如,假设有两个表A和B,它们都有一个名为ID的字段,我们可以使用以下查询语句来找出在表A中存在但在表B中不存在的数据:

SELECT A.ID FROM A LEFT JOIN B ON A.ID = B.ID WHERE B.ID IS NULL;
  1. 在PHP中执行SQL查询语句,并将结果保存在一个数组中。

例如,使用mysqli扩展库连接MySQL数据库,并执行上述查询语句:

$conn = mysqli_connect("localhost", "username", "password", "database");
$query = "SELECT A.ID FROM A LEFT JOIN B ON A.ID = B.ID WHERE B.ID IS NULL";
$result = mysqli_query($conn, $query);

$data = array();
while ($row = mysqli_fetch_assoc($result)) {
    $data[] = $row['ID'];
}

这里将查询结果保存在一个名为$data的数组中,数组中的每个元素表示在表A中存在但在表B中不存在的数据。

  1. 对于需要返回缺失数据的情况,可以直接返回保存查询结果的数组。

例如,可以将$data数组作为函数返回值:

function getMissingData() {
    $conn = mysqli_connect("localhost", "username", "password", "database");
    $query = "SELECT A.ID FROM A LEFT JOIN B ON A.ID = B.ID WHERE B.ID IS NULL";
    $result = mysqli_query($conn, $query);

    $data = array();
    while ($row = mysqli_fetch_assoc($result)) {
        $data[] = $row['ID'];
    }

    return $data;
}

这样,调用getMissingData函数就可以获取在表A中存在但在表B中缺失的数据。

oracle 使用minus 实现集合减法,
SELECT id FROM t1
MINUS
SELECT id FROM t2;
但mysql不支持,
mysql可以使用LEFT JOIN子句返回与MINUS运算符相同的结果:

参考例子:

CREATE TABLE t1 (
    id INT PRIMARY KEY
);

CREATE TABLE t2 (
    id INT PRIMARY KEY
);

INSERT INTO t1 VALUES (1),(2),(3);
INSERT INTO t2 VALUES (2),(3),(4);


SELECT 
    id
FROM
    t1
        LEFT JOIN
    t2 USING (id)
WHERE
    t2.id IS NULL;

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
使用左联接查询是可行的,但是需要注意一下几点:

  1. 在SELECT后面选择需要查询的A表中的字段,不要选择B表的字段,否则在B表中找不到匹配时,会显示null。
  2. 在WHERE子句中添加 IS NULL 条件,以过滤掉已经在B表中存在的数据。

以下是示例代码:

SELECT A.ID FROM A LEFT JOIN B ON A.ID = B.ID WHERE B.ID IS NULL;

这里假设A表中的ID字段需要查询,B表中的ID字段也需要进行比较。

如果您需要将结果存储到数据库中,可以使用以下代码:

INSERT INTO C (ID) SELECT A.ID FROM A LEFT JOIN B ON A.ID = B.ID WHERE B.ID IS NULL;

这里假设新建了一个名为C的表来存储结果。
如果我的回答解决了您的问题,请采纳!

问题描述:
在使用 PHP 和 MySQL 进行两表比较时,如果存在缺失的数据,如何返回这些缺失的数据?
解决方法:
在 MySQL 中,可以使用左联查询(LEFT JOIN)来比较两个表中的数据。左联查询会返回左表中的所有数据,以及右表中与左表匹配的数据。如果右表中不存在与左表匹配的数据,则返回 NULL 值。
在 PHP 中,可以使用 mysqli_fetch_assoc() 函数来获取查询结果中的每一行数据,并使用 isset() 函数来判断该行数据中是否存在 NULL 值。如果存在 NULL 值,则说明右表中缺失该行数据,可以将该行数据添加到结果数组中。
下面是一个示例代码:
php
// 连接数据库
$conn = mysqli_connect("localhost", "username", "password", "database");
// 查询左表中的所有数据
$sql = "SELECT * FROM table1";
$result = mysqli_query($conn, $sql);
// 将左表中的数据存储到数组中
$data = array();
while ($row = mysqli_fetch_assoc($result)) {
$data[$row['id']] = $row;
}
// 查询左表和右表中匹配的数据
$sql = "SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id";
$result = mysqli_query($conn, $sql);
// 将缺失的数据存储到数组中
$missing_data = array();
while ($row = mysqli_fetch_assoc($result)) {
if (isset($row['table2.id']) && $row['table2.id'] != null) {
// 右表中存在该行数据,不需要添加到结果数组中
} else {
// 右表中缺失该行数据,将该行数据添加到结果数组中
$missing_data[] = $data[$row['table1.id']];
}
}
// 输出缺失的数据
foreach ($missing_data as $row) {
echo $row['id'] . " " . $row['name'] . " " . $row['age'] . "
";
}
// 关闭数据库连接
mysqli_close($conn);
?>

在上面的代码中,首先查询左表中的所有数据,并将其存储到数组中。然后使用左联查询查询左表和右表中匹配的数据,并使用 isset() 函数判断该行数据中是否存在 NULL 值。如果存在 NULL 值,则说明右表中缺失该行数据,将该行数据添加到结果数组中。最后输出结果数组中的数据即可。
总结:
在 PHP 和 MySQL 中,使用左联查询可以比较两个表中的数据,并返回缺失的数据。在 PHP 中,可以使用 mysqli_fetch_assoc() 函数获取查询结果中的每一行数据,并使用 isset() 函数判断该行数据中是否存在 NULL 值。如果存在 NULL 值,则说明右表中缺失该行数据,可以将该行数据添加到结果数组中。