MySQL:查询具有某个排他列值的记录组

MySQL:查询具有某个排他列值的记录组,mysql,Mysql,我有以下记录: name acct_num address city rep primary DARTMOUTH HITCHCOCK HOSPITAL 1212 MEDICAL CENTER DR LEBANON P Meehan Y DARTMOUTH HITCHCOCK HOSPITAL 1212 MEDICAL CENTER DR LEBANON P Johnson

我有以下记录:

name                            acct_num    address     city        rep     primary
DARTMOUTH HITCHCOCK HOSPITAL    1212 MEDICAL CENTER DR  LEBANON P   Meehan    Y
DARTMOUTH HITCHCOCK HOSPITAL    1212 MEDICAL CENTER DR  LEBANON P   Johnson   N

MASSACHUSETTS GENERAL HOSPITAL  891 PO BOX 123  CHARLESTOWN P   Morrison  N
MASSACHUSETTS GENERAL HOSPITAL  891 PO BOX 123  CHARLESTOWN P   McCoy     N
MASSACHUSETTS GENERAL HOSPITAL  891 PO BOX 123  CHARLESTOWN P   Lorena    N

CLINIC PHARMACY CONTROL SUPPLY  282043  1 MEDICAL CENTER DR LEBANON P Sikes   N
CLINIC PHARMACY CONTROL SUPPLY  282043  1 MEDICAL CENTER DR LEBANON P Kang    Y
CLINIC PHARMACY CONTROL SUPPLY  282043  1 MEDICAL CENTER DR LEBANON P Tolbert N
基本上,我需要查询任何没有主要联系人的医院(全部为primary='N')。所以在上面的记录中,我需要去马萨诸塞州总医院,因为所有的记录都是primary='N'

我试过:

SELECT * FROM `account_prof_affiliation_view` where primary_sf='N' GROUP BY accnt_num

但这只会捕获甚至只有一个primary='N'的所有记录。什么是正确的SQL查询来执行此操作?

一种方法是:

SELECT name, accnt_num
FROM account_prof_affiliation_view
GROUP BY accnt_num, name
HAVING MAX(primary) = 'N'

这利用了这样一个事实,即
'Y'
排序在
'N'
之后,因此
最大值(主)
将是
'Y'
,只要该组中有一个
'Y'

一种方法是:

SELECT name, accnt_num
FROM account_prof_affiliation_view
GROUP BY accnt_num, name
HAVING MAX(primary) = 'N'

这利用了这样一个事实,即
'Y'
'N'
之后排序,因此
MAX(primary)
将是
'Y'
,只要该组中有一个
'Y'

当您按
分组时,它必须包含您选择的所有最小数据。

当您按
分组时,它必须至少包含您选择的所有数据。

如果您不想依赖排序规则,那么您可以使用以下方法:

select * from account_prof_affiliation_view a
where not exists (
  select `primary` from account_prof_affiliation_view b
  where b.id=a.id
  and   b.primary = 'Y'
)
SELECT accts.account_num
FROM (SELECT DISTINCT account_num FROM account_prof_affiliation_view) accts
     LEFT JOIN account_prof_affiliation_view aff
            ON (aff.primary_sf = 'Y' AND aff.account_num = accts.account_num)
WHERE aff.account_num IS NULL

请注意,您的数据库模式似乎违反了:名称、地址和城市很可能是从account_num推断出来的,因此最好为该信息使用单独的表。如果这是因为数据来自一个视图(如名称所示),而不是来自实际的表,那么这是可以的,但是您仍然可以通过使用上面子查询中的基础表而不是整个视图来提高效率。

如果您不想依赖排序规则,那么您可以使用以下方法:

SELECT accts.account_num
FROM (SELECT DISTINCT account_num FROM account_prof_affiliation_view) accts
     LEFT JOIN account_prof_affiliation_view aff
            ON (aff.primary_sf = 'Y' AND aff.account_num = accts.account_num)
WHERE aff.account_num IS NULL

请注意,您的数据库模式似乎违反了:名称、地址和城市很可能是从account_num推断出来的,因此最好为该信息使用单独的表。如果这是因为数据来自视图(如名称所示),而不是来自实际的表,那么这是可以的,但是您仍然可以通过使用上面子查询中的基础表来提高效率,而不是整个视图。

Fiddle for experiments在Fiddle for experiments在Fiddle for experiments在工作,速度也很快,因为我有超过80k的记录。我很感谢你的帮助。我有超过8万张唱片,工作也很快。我感谢你的帮助。