我有以下查询:
SELECT question_code FROM table_questions WHERE question_code IN (1,2,3,111,222);
这里,值(1,2,3,111,222)来自PHP数组。
上述查询的输出为:
question_code
1
2
3
我希望输出是不在表中并出现在数组中的question_codes。
即。我希望输出为question_code,表格中不存在。
question_code
111
222
我知道在从表中检索数据后,可以在PHP中处理此问题。但是因为我可能有大量的元组,所以在查询级别可以处理这个问题的解决方案会很有帮助。
答案 0 :(得分:0)
您将获得数组中SELECT question_code FROM table_questions WHERE question_code IN (1,2,3,111,222);
的记录,值(1,2,3,111,222)
来自PHP数组。
使用array_diff
比较两个数组并获得差异。
供参考http://www.w3schools.com/php/func_array_diff.asp
答案 1 :(得分:0)
如果要使用纯SQL,则必须使用LEFT JOIN:
SELECT c.question_code
FROM (SELECT 1 AS question_code
UNION ALL select 2
UNION ALL SELECT 3
UNION ALL SELECT 111
UNION ALL SELECT 222) AS c
LEFT JOIN table_questions q
ON c.question_code = q.question_code
WHERE
q.question_code IS NULL
您可以动态创建子查询SELECT .. UNION ALL ..
,如下所示:
<?php
$ids = array(1,2,3);
$subquery = str_repeat('SELECT ? AS q UNION ALL ', count($ids) - 1) . 'SELECT ? AS q';
$sql = <<<SQL
SELECT c.q FROM ($subquery) AS c
LEFT JOIN table_questions q
ON c.q = q.question_code
WHERE
q.question_code IS NULL
SQL;
$stm = $db->prepare($sql);
$stm->execute($ids);
$data = $stm->fetchAll();
?>
但它可能不太实际......唯一的选择是在php中处理返回的question_codes
代码。