mysql - 如何在带有负条件的SQL中按 block 进行分组?

标签 mysql sql

我问了一个问题 here 。现在,我需要它的反向输出。我有以下表格 My_Table,其结构如下,

Name   | Address
----------------
Test1  | abc_123
Test1  | abc_456
Test2  | xyz_123
Test1  | xyz_123
Test2  | xyz_456
Test3  | abc_123
Test4  | xyz_123
Test1  | xyz_456
Test3  | xyz_123
Test4  | xyz_456

我需要如下输出,

Name   
-------
Test2 
Test4

我需要按 block 进行分组并选择名称,这样所有地址的前缀都不为abc

输出详细解释:

Test1 的地址为 abc_123、abc_456、xyz_123、abc_123,并且至少有一个地址的前缀为 abc。因此不在输出中。 Test2 的地址为 xyz_123、xyz_456,并且它们都没有前缀 abc。因此在输出中。

x = select distinct(Name) from My_Table
y = select distinct(Name) from My_Table where Address like 'abc%'

Result  = x - y

我能够使用 2 个查询(如上所示)然后在结果集中使用减法运算来获得结果,但这可以在单个查询中实现吗?

注意:我使用JAVA来查询MYSQL DB,因此我可以减去结果集。我的表大小很大,因此我想优化查询数量!

最佳答案

一种方法使用聚合,与另一个答案类似:

select name
from my_table
group by name
having sum(address like 'abc%') = 0;

having 子句计算匹配行的数量。 = 0 表示没有给定名称。

关于mysql - 如何在带有负条件的SQL中按 block 进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34066839/

相关文章:

sql - Oracle 去除重复字符

php - 由于连字符导致的 pq_query 语法错误。我怎么写这个?

php - 如何在 PHP 和 SQL 中格式化日期?

mysql - 3 个连接的 mysql 表的最新记录

mysql - 使用多选的 SQL 语法错误

java - Mybatis 的用途

php - 为什么我可以用 NULL 值初始化该列,但无法这样更新它?

sql - UTC 时间到本地时区(中部时间)转换 MS SQL Server

mysql - 使用 LEFT 连接和连接条件进行更高效的 SELECT 查询

python - Django 查询性能