选择不在表中的值

时间:2012-01-12 09:10:35

标签: php mysql sql arrays

假设我在PHP中有三个值:“a”,“b”,“c”。无论是数组还是逗号分隔的字符串。
数据库中有一个表:

id | value  
1  | a  
2  | b  
3  | d  

我的目的是找到php数组中但不在数据库表中的值 给出的例子将给出“c” 我只用一个查询就能做到吗?

更新

在有关array_diff()的答案中收到了几个很好的建议,但在我的情况下,DB表非常大,数组不超过5-6个项目。因此,我认为执行5-6个查询会更好。

6 个答案:

答案 0 :(得分:4)

如果PHP数组很短,您可以构建UNION ALL查询来构建表,然后使用NOT INLEFT JOIN查询(以较为者为准)更快)对表:

SELECT value
FROM (
    SELECT 'a' AS value
    UNION ALL
    SELECT 'b'
    UNION ALL
    SELECT 'c'
) AS php_array_values
WHERE value NOT IN (
    SELECT value
    FROM that_large_table
);

或者,您可以将php数组值插入临时表中,并使用INJOIN查询。当然,这意味着你最终会写三个额外的查询:

CREATE TEMPORARY TABLE IF NOT EXISTS php_array_values (value VARCHAR(100));

DELETE FROM php_array_values;

INSERT INTO php_array_values VALUES ('a'), ('b'), ('c');

SELECT php_array_values.value
FROM php_array_values
LEFT JOIN that_large_table ON php_array_values.value = that_large_table.value
WHERE that_large_table.value IS NULL

答案 1 :(得分:1)

怎么样?

<?php
    $a = array('a', 'b', 'c');
    $values = implode("','", $a);
    $sql = "SELECT DISTINCT `value` FROM `mytable` WHERE `value` IN ('$values')";
    echo $sql;

执行sql查询。结果将是您已经拥有的0到3个元素。接下来,做一个array_diff(它根本不会很重,因为你将拥有你的初始小数组,以及数据库中那些数组,甚至更小)。

$not_in_db = array_diff($a, $array_from_sql_result);

如果您拥有的是带逗号分隔值的字符串,那么您首先需要“爆炸”它:

$s = "a,b,c";
$a = explode(",", $s);

答案 2 :(得分:0)

您可以选择表格中的所有条目,然后执行array_diff()

但这不是一个查询,是一个查询和一些后期处理。

答案 3 :(得分:0)

为此,我会将表中的值拉入数组并使用array_diff

参考:http://www.php.net/manual/en/function.array-diff.php

答案 4 :(得分:0)

select max(*) as count from tablename 
where field1 != $arr[0] && field2 != $arr[1] && field3 != $arr[2];

如果需要,您可以使用和或或运算符。如果此查询的返回计数为0,则数据库中的数组值不存在。

答案 5 :(得分:0)

您可以尝试使用“LIKE”语句,而不是从DB中提取所有元素,这将减少从DB中提取的条目数。

类似的东西:

PHP数组值:a,b,c

DB值:a,b,d

select value from your_table_name where (value LIKE '%a%') OR (value LIKE '%b%') OR (value LIKE '%c%');

o / p这将是:{a,b}

现在使用php的 array_diff