【问题标题】:How can I get the opposite of WHERE id IN (...)?我怎样才能得到 WHERE id IN (...) 的反义词?
【发布时间】:2012-04-10 12:29:00
【问题描述】:

以下查询查找表ids,如果找到例如204720966837,则返回id。
我的问题是我该如何做相反的事情?我想显示那些没有找到的id的id。

SELECT id FROM ids WHERE id IN  ('204720966837', '163700377960', '24583115900', '1081617368').

现在我有 204720966837 保存在 ids 中,这就是它打印的内容。我的目标是打印 163700377960, 24583115900, 1081617368

while($assoc = mysql_fetch_assoc($query)) {
    echo $assoc['id'];   
}

我试过 NOT IN 但我得到了零回报。

【问题讨论】:

  • NOT IN 听起来不错。您确定零回报不是您数据的正确答案吗?真的确定吗?
  • @JohnFx 不回我 163700377960、24583115900、1081617368 怎么可能是对的?我只保存了 204720966837。
  • 将问题分解为 2 个步骤 - 如果您直接对您的数据库 (MySQL WorkBench/phpMyAdmin) 运行 NOT IN 查询会发生什么?如果数据在那里,我看不出任何NOT IN 不起作用的原因......
  • @Basic 我通过 phpMyAdmin 运行它。当我使用IN 时,它会返回我保存的那个。当我使用 NOT IN 时,我得到 0 行。
  • 从ids中选择count();然后从 ID in ('your list') 的 ids 中选择 count() 然后从 ID 不在 ('your list') 中的 ides 中选择 count(*) 如果你 Not in + in 是 count 那么你有一个严重的问题。因为你的数据库不理解集合逻辑。

标签: php mysql


【解决方案1】:

Not IN 始终与子查询一起使用,可能是您的 Not IN 语法错误,请更正并重试。

【讨论】:

    【解决方案2】:

    您可以使用临时表:

    CREATE TEMPORARY TABLE temp_table (id int);
    
    INSERT INTO temp_table(id) VALUES('204720966837'), ('163700377960'), ('24583115900'), ('1081617368');
    
    SELECT id FROM temp_table WHERE id NOT IN(SELECT id FROM ids)
    
    DROP TABLE temp_table;
    

    【讨论】:

    • 他不是在数据库中寻找不在他的 ID 列表中的行,而是在他的列表中寻找不在数据库中的 ID。
    【解决方案3】:

    我敢打赌

     WHERE IN ()
    

    也不行。

    试一试,这应该会引导您找到解决方案。

    【讨论】:

      【解决方案4】:

      试试

      SELECT id FROM ids 
      WHERE id != '204720966837' 
      AND id != '163700377960'
      AND id !='24583115900' 
      AND id !='1081617368' 
      

      【讨论】:

        【解决方案5】:

        在 php 中进行比较可能更容易。

        $id_list = array('204720966837', '163700377960', '24583115900', '1081617368');
        
        $result = mysql_query('SELECT id FROM ids WHERE id IN  (' . implode(',', $id_list) . ')');
        $found = array();
        while ($row = mysql_fetch_assoc($result)) {
          $found[] = $result['id'];
        }
        $diff = array_diff($id_list, $found);
        

        $diff 将包含您正在搜索但未找到的 ID。

        【讨论】:

        • 这可能是最好的方法。因为 MySQL 不是为这种操作而设计的,在这种操作中,您只有一些正在使用的数据在数据库中,而其他数据在客户。
        【解决方案6】:

        我的疯狂猜测是你想要:

        SELECT id
        FROM
          ( SELECT 204720966837 AS id
              UNION ALL
            SELECT 163700377960
              UNION ALL
            SELECT 24583115900
              UNION ALL
            SELECT 1081617368 
          ) AS tmp
        WHERE id NOT IN
              ( SELECT id FROM ids )
        

        【讨论】:

        • @Basic:“gah”代表awesome,我想:)
        • 我会尽可能地实用和可读,但是,它缺乏一点优雅:)
        • @Basic:不幸的是 MySQL 没有优雅的 Table Value Constructors
        • @ypercube 完全同意——我作弊得更远,现在使用实体框架——我在开发过程中甚至从未接触过 SQL :)
        • 另一种 - 虽然类似 - 方式:SELECT tmp.id FROM ids RIGHT JOIN (SELECT 1 AS id UNION SELECT 2 UNION SELECT 3) AS tmp ON tmp.id=ids.id WHERE ids.id IS NULL 我仍然想知道为什么没有更短的方法来编写结果集,没有所有这些 UNION...
        【解决方案7】:

        NOT IN 仅在您返回集合时才有效。

        试试

        SELECT id FROM ids WHERE id NOT IN (SELECT '204720966837', '163700377960', '24583115900', '1081617368')

        有关此主题的全面讨论,请参阅 MySQL "NOT IN" query。

        【讨论】:

        • #1241 - 操作数应包含 1 列
        • ID 列表被视为一个集合 - 链接 Q 中 OP 的问题是他只是引用 table2.principal 而没有包含 table2 的查询
        • 好吧,我不是 100% 了解 mysql 如何将子查询作为集合处理,谢谢。
        • 您可以使用返回多行和一列的子查询。选择这样的文字数字会返回一行多列。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-19
        • 1970-01-01
        • 1970-01-01
        • 2018-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多