将PHP数组的值与大表MySQL进行比较

时间:2015-11-27 21:53:49

标签: php mysql

好吧,如果我只比较几个值,通常我会在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

3 个答案:

答案 0 :(得分:0)

你可以join PHP中数组$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数组无论如何都会   将它带到后,只从结果中删除几个项目   存储器中。

答案 1 :(得分:0)

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

<?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";
}
?>

我希望这会有所帮助

答案 2 :(得分:0)

考虑使用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的大小,请考虑附加到临时表并加入上面的内容,将子查询替换为临时表。