我在从这张表中进行选择时遇到了一些麻烦(考虑)。
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
我如何进行选择查询以显示表中没有0
的det_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/