我是否可以仅使用一个查询找到数组中的哪些值没有相应的数据库记录?

时间:2015-01-02 03:32:49

标签: php mysql

我从上传的文件中获得了一些值的数组。我想确定文件中的哪些值 not 在我的数据库中。

我已经知道如何通过循环遍历数组并检查数据库中每个值的匹配记录来一次检查一个值。

$stmt = $pdo->prepare('SELECT COUNT(*) FROM my_table WHERE a_column = ?');
foreach ($values as $value) {
    $stmt->execute([$value]);
    if ($stmt->fetchColumn() === '0')   // do something with $value
}

但我想知道是否有办法在一个查询中获得结果。如果我已经在SQL表中使用了这些值,那么通过连接表并检查相关表中空值的结果,很容易找到哪些值在另一个表中具有匹配值。

SELECT i.value
FROM
    imaginary_values_table i
    LEFT JOIN my_table m ON i.value = m.a_column
WHERE
    m.id IS NULL

是否可以使用值列表来执行此类查询?

我熟悉IN,但我不知道如何直接使用它,因为我试图找到数组中的哪些项目在一张桌子里。使用IN我可以从表格中获取表格中的所有行,或者使用NOT IN我可以获得不在我的数组中的所有行。

2 个答案:

答案 0 :(得分:2)

您可以使用以下查询:

SELECT t1.val
FROM (SELECT 1 AS val
      UNION
      SELECT 2 AS val
      UNION
      SELECT 3 AS val
      ...) AS t1
LEFT JOIN my_table AS t2 ON t1.val = t2.a_column
WHERE t2.a_column IS NULL

您可以从值数组中构建UNION子查询:

$union = implode(' UNION ', array_map(function($val) {
    return "SELECT $val AS val";
}, $array));

答案 1 :(得分:0)

我找到了一种不同的方法,通过使用IN选择与数组中的值匹配的所有行,然后使用array_diff与原始数组和查询结果来获取那些不是& #39;那里。

$qs = rtrim(str_repeat('?,', count($values)),',');
$stmt = $pdo->prepare("SELECT a_column FROM my_table WHERE a_column IN ($qs)");
$stmt->execute($values);
$not_there = array_diff($values, $stmt->fetchAll(PDO::FETCH_COLUMN));