假设我在PHP中有三个值:“a”,“b”,“c”。无论是数组还是逗号分隔的字符串。
数据库中有一个表:
id | value
1 | a
2 | b
3 | d
我的目的是找到php数组中但不在数据库表中的值 给出的例子将给出“c” 我只用一个查询就能做到吗?
更新
在有关array_diff()的答案中收到了几个很好的建议,但在我的情况下,DB表非常大,数组不超过5-6个项目。因此,我认为执行5-6个查询会更好。
答案 0 :(得分:4)
如果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
答案 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
答案 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 。