从数组里面返回数据' IN(....)' SELECT查询

时间:2015-09-20 10:33:38

标签: php mysql arrays

我有以下查询:

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中处理此问题。但是因为我可能有大量的元组,所以在查询级别可以处理这个问题的解决方案会很有帮助。

2 个答案:

答案 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代码。