【问题标题】:Compare values of a PHP array with a large table MySQL将 PHP 数组的值与 MySQL 的大表进行比较
【发布时间】:2015-11-27 21:53:49
【问题描述】:

好的,如果我只比较几个值,通常我会在 PHP 中做这样的事情:

// I want to get 1
$a = array(1,2);
$b = array(2);

// It produces 1
$result = array_diff($a, $b);

但在这种情况下,$b 是 MySQL 中的一个大表,有数百万行,将其检索到 PHP 会很疯狂,所以我的 DBMS (MySQL) 必须完成这项工作。

我该怎么做:

-- I need treating $a as a column 
SELECT $a NOT IN (SELECT id FROM b);

示例

表 B

|id|
 2
 3
 4

数组A

array(1, 2, 3, 5);

结果

A - B = A - INTERSECT(A,B) = [1, 5]

示例 2

This is 正是我需要的 SQL 服务器。有什么想法可以在 MySQL 中做类似的事情吗?

注意:A 大约有 5000 个 id,所以:

SELECT 1
UNION SELECT 1
UNION SELECT 1
UNION SELECT 2
UNION SELECT 5
...

...产生#1064 - memory exhausted

【问题讨论】:

  • 这听起来和PHP无关。如果您发布有关数据库结构的一些信息,您可能会得到一些帮助。在 www.sqlfiddle.com 上设置一些东西会更好。
  • @miken32 我认为不需要知道数据库结构,我只是想将ids与ids进行比较
  • @Alberto 所以你想获取数据库中不存在的ID,对吧?
  • @FrederickMarcoux 是的,就是这样
  • @Alberto 看看:dba.stackexchange.com/a/37628

标签: php mysql


【解决方案1】:

您可以在 PHP 中 join 数组 $a 中的变量,并在您的 SQL 查询中使用它来检索数据,这在您的情况下会很有效。

$in = join(',', array_fill(0, count($a), '?'));
$sql = "
    SELECT *
    FROM galleries
    WHERE id IN ($in)"

这是一个有效的fiddle,以证明SQL 查询将返回所需的输出。

编辑:

根据您的新要求,您可以在 PHP 方面,因为您必须以某种方式从 MySQL 从 PHP 数组中消除结果。如果您检索 数组$a 从另一个表然后我们可以做类似的事情 加入。但在这种情况下,我们不能这样做。你还提到 MySQL 表有大量的行,所以我假设 PHP 数组无论如何都会 将结果带到 记忆。

【讨论】:

  • 谢谢...但这不会产生与我发布的相同的结果。如果画廊有我的 $b 列 2 并且我将 1, 2 放在 IN 运算符中,它将返回 2,我需要得到 1
  • @Alberto 改用NOT IN
  • @FrederickMarcoux 使用 NOT IN 将返回 0 行
  • @Alberto 好吧,更清楚地解释你需要做什么,因为它看起来有点混乱。这样做的目的是什么?
  • @Alberto 您是否尝试返回一些行,但 $b 列的值是 $a 值之一?
【解决方案2】:

如果你想检查值是否存在,你可以试试这个

<?php
$some_id = "100";

$id = mysql_real_escape_string($some_id); // i use escape to compare IP ADDRESSES. you can remove it
$result = mysql_query("SELECT id FROM your_table WHERE id = '$id'");
if (!mysql_num_rows($result))
{
echo "Not Exists";
}
else
{
echo "Exists";
}
?>

我希望这会有所帮助

【讨论】:

    【解决方案3】:

    考虑使用 JOIN NULL 查询:

    strSQL = "SELECT t2.id 
              FROM tableB t1
              RIGHT JOIN
                (SELECT id 
                 FROM tableB 
                 WHERE id IN (".implode(',',$arrayA).")
                ) t2
              ON t1.id = t2.id
              WHERE t1.id IS NULL";
    

    另外,根据$arrayA 的大小,考虑附加到临时表并在上面加入,用临时表替换子查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      相关资源
      最近更新 更多