假设我在PHP中有三个值:"a“、"b”、"c“。不管是在数组中还是逗号分隔的字符串中。
数据库中有一个表:
id | value
1 | a
2 | b
3 | d
我的目的是查找php数组中的值,而不是数据库表中的值。
给出的例子将给出"c“。
我只能用一个查询来完成它吗?
更新
在关于array_diff()的回答中收到了一些很好的建议,不过在我的例子中,DB表非常大,数组的项不超过5-6项。所以我认为执行5-6个查询会更好。
发布于 2012-01-12 09:22:34
如果PHP数组很短,您可以构建一个UNION ALL
查询来构建您的小表,然后对大型表使用NOT IN
或LEFT 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数组值,并使用IN
或JOIN
查询。当然,这意味着您最终需要编写三个额外的查询:
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
发布于 2012-01-12 09:59:38
这个怎么样?
<?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 (它不会太重,因为您将拥有初始的小数组,而db中的数组则更小)。
$not_in_db = array_diff($a, $array_from_sql_result);
如果您所拥有的是一个带有逗号分隔值的字符串,那么您需要首先“引爆”它:
$s = "a,b,c";
$a = explode(",", $s);
发布于 2012-01-12 09:13:50
您可以选择表中的所有条目,然后执行array_diff()
。
但这不是一个查询,而是一个查询和一些后处理。
https://stackoverflow.com/questions/8832465
复制相似问题