MySQL - 如何选择没有特定数据的查询值

标签 mysql select

我在从这张表中进行选择时遇到了一些麻烦(考虑)。

tb_details:

id            status             det_id
1               5                  22  
2               1                  22
3               0                  22
4               5                  25
5               1                  25
6               5                  27
7               1                  27
8               5                  32
9               1                  32
10              0                  32

我如何进行选择查询以显示表中没有0det_id,也许是什么像这样:

det_id
  25
  27

最佳答案

一种方法(在几种可行的方法中)是使用反连接模式。

SELECT t.det_id
  FROM this_table t
  LEFT
  JOIN ( SELECT r.det_id
           FROM this_table r
          WHERE r.status = 0
          GROUP BY r.det_id
       ) s
    ON s.det_id = t.det_id
 WHERE s.det_id IS NULL
 GROUP BY t.det_id

让我们稍微解压一下。

内联 View (别名为 s )返回一个不同的列表det_id status=0 的值this_table 中确实存在行.

LEFT JOIN操作返回所有 det_id来自 this_table 的值<强> t ,以及匹配的 det_id来自 s 。如果未找到匹配项,则连接的“左外”意味着来自 t 的所有行 将返回,无论是否找到匹配项。

“技巧”是 WHERE 中的谓词子句,测试是否从 s 返回的列的值 是否为 NULL。该谓词有效地排除了 t 中的任何行 s 中找到匹配的行.

因此,剩下要返回的是来自 t 的行 s 中没有匹配项.

我们添加一个GROUP BY t.det_id (或者我们可以添加 DISTINCT 关键字),以返回不同的列表 det_id值(value)观。


这不是唯一的方法。你也可以使用 NOT EXISTS谓词 ...

SELECT t.det_id
  FROM this_table t
 WHERE NOT EXISTS
       ( SELECT 1
           FROM this_table r
          WHERE r.det_id = t.det_id
            AND r.status = 0
       )
 GROUP BY t.det_id

(这略有不同,因为 det_id 的空值行可能会返回,而先前的查询不会返回它。可以调整第一个查询以使其返回与此相同的结果。)

您也可以使用 NOT IN ,注意子查询不会为 det_id 返回任何 NULL 值。 .

SELECT t.det_id
  FROM this_table t
 WHERE t.det_id NOT IN
       ( SELECT r.det_id
           FROM this_table r
          WHERE r.status = 0
            AND r.det_id IS NOT NULL
          GROUP BY r.det_id
       )
 GROUP BY t.det_id

有几个语句将返回指定的结果集。

关于MySQL - 如何选择没有特定数据的查询值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24690022/

相关文章:

mysql - SQLFiddle 的存储过程和游标

mysql - hibernate OneToOne 关系中的未知mappedBy

php - mysqli::mysqli(): (HY000/2002) 本地主机不工作

c++ - 管道+选择: select never woken up

sql - PL/SQL 函数返回 ORA-06503 : PL/SQL: Function returned without value

MySQL性能优化: order by datetime field

mysql - 在MySQL中删除 'older'行的正确方法

Mysql从存储过程插入给出错误1064

mysql - 获取百分比和 group by 语句

sql - 使用一个 SQL 语句的结果在另一语句中进行计数