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

时间:2014-07-11 04:16:00

标签: 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

如何制作一个选择查询以显示表格中没有det_id的{​​{1}}值,可能是这样的:< / p>

0

3 个答案:

答案 0 :(得分:3)

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

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

让我们解开一点。

内嵌视图(别名为 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值的列表。


这不是唯一的方法。您还可以使用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的NULL值的行,前一个查询不会返回它。可以调整第一个查询以使其返回与此相同的结果。)

您也可以使用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

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

答案 1 :(得分:1)

另一种更简单的方法是: -

SELECT DISTINCT det_id FROM TB
WHERE det_id NOT IN
(SELECT det_id RFOM TB WHERE status = 0);

答案 2 :(得分:0)

如果你想只有det_id,其他列不是0你应该写

SELECT det_id FROM TABLE WHERE
 Col1 <> 0
AND
 Col2 <> 0

依旧......

如果每个类型只需要1个结果添加

GROUP BY det_id

在查询结束时。