选择不在表中的值

3
假设我在PHP中有三个值:“a”,“b”,“c”,无论是在数组中还是以逗号分隔的字符串形式,都不重要。
数据库中有一张表:
id | value  
1  | a  
2  | b  
3  | d  

我的目的是找到在php数组中但不在数据库表中的值。
给定的例子将给出"c"。
我能只用一个查询来完成吗?

更新

在答案中收到了几个关于array_diff()的好建议,但在我的情况下,数据库表非常大,而数组最多只有5-6项。所以我认为最好执行5-6个查询。


你真的必须使用 SQL 查询来完成吗? - Salman A
我更倾向于这样做。并且想知道是否可能。 - lvil
6个回答

5
如果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

我特别喜欢第一个解决方案! - Bangline
@Bangline:注意,NOT IN 是一个可能导致缓慢的操作符。 - nikc.org
@nick:你说得对。示例2中显示的“LEFT JOIN”查询将适用于这两个示例。 - Salman A

2

这个怎么样?

<?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);

如果我理解正确的话,你的答案是一个相反的任务(从表中选择不在数组中的值)。 - lvil
@lvil 哦...谢谢!我完全搞反了。现在一切都好了 :) - davogotland

0
你可以选择表中的所有条目,然后执行 array_diff()
但这不是一个查询,而是一个查询和一些后期处理。

0

谢谢。虽然这是个好建议,但在我的情况下,数据库表非常大,而数组中的项不超过5-6项。因此,进行5-6个查询会更好,我想。 - lvil
很好,如果表格非常大的话,我认为这可能会有点沉重。对该数据进行差异比较将完全低效。除非这里有 SQL 大师提出了什么方法,否则执行 5-6 个查询似乎更合适。 - Bangline

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

如果需要的话,您可以使用“and”或“or”运算符。如果此查询的返回计数为0,则表示数组值尚未存在于数据库中。


0

不必从数据库中拉取所有元素,可以尝试使用“LIKE”语句,这将减少从数据库中检索的条目数量。

类似于这样:

PHP数组值:a、b、c

数据库值:a、b、d

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

这段代码的输出将为: {a,b}

现在可以使用PHP的array_diff函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接