数据库:如果任何行中的字段 X 具有值 Y,则排除“分组依据”组

Posted

技术标签:

【中文标题】数据库:如果任何行中的字段 X 具有值 Y,则排除“分组依据”组【英文标题】:Database: exclude 'group by' group if field X in any row has value Y 【发布时间】:2013-01-30 10:11:00 【问题描述】:

我正在为此使用 mysql

(我删除了不相关的连接以保持更清晰)

我正在尝试选择公司的地址,按 company_id 分组,但如果整个用户在特定国家/地区有任何地址(ID 为 242),则排除整个用户

所以我尝试的第一个查询是:

SELECT c.company_id
FROM companies c
NATURAL JOIN addresses a
WHERE a.country_id != 15
GROUP BY c.company_id

据我了解,这首先进行选择,然后排除 country_id 为 15 的行,然后返回其余行的 company_id,这些行是不同的,因为它们已被分组。

因此,这将返回至少有一个地址在国家 15 之外的任何公司。我需要排除在该国家/地区拥有地址的任何公司。

我该怎么做?

【问题讨论】:

【参考方案1】:
SELECT c.company_id
FROM companies c
NATURAL JOIN addresses a
WHERE NOT EXISTS 
   (SELECT * FROM addresses a1 
    WHERE c.company_id = a1.company_id AND a1.country_id = 15)
GROUP BY c.company_id

或者,您可以使用另一个联接而不是存在子查询。使用它可能会获得更好的性能,因为子查询只解析一次。

SELECT c2.company_id
FROM (SELECT c.company_id
    FROM companies c
    NATURAL JOIN addresses a
    GROUP BY c.company_id) AS c2
LEFT JOIN addresses a2
ON a2.company_id = c2.company_id AND a2.country_id = 15
WHERE a2.company_id IS NULL

【讨论】:

【参考方案2】:
SELECT
  c.company_id
FROM
  companies c
  LEFT JOIN addresses a
  on c.company_id = a.company_id and a.country_id=15
WHERE a.country_id is null
GROUP BY c.company_id

【讨论】:

【参考方案3】:

试试这个:

SELECT c.company_id
FROM companies c
    LEFT JOIN addresses a
        ON c.AddressId = a.Id
WHERE a.country_id != 15
   OR a.country_id IS NULL
GROUP BY c.company_id

【讨论】:

以上是关于数据库:如果任何行中的字段 X 具有值 Y,则排除“分组依据”组的主要内容,如果未能解决你的问题,请参考以下文章

按列分组并选择具有多个最小值的行中的所有字段

如果这些行中至少有一个具有给定值,则选择具有给定 ID 的所有行

如果具有该 ID 的任何记录满足两个条件,则排除该 ID 的所有记录

查找 2 列的空值的过程,如果为真,则使用这些行中的一些值来执行某些操作

SQL 删除行,其中一个值与 DIFFERENT 列中的值匹配

有条件地显示具有匹配值的单元格的行中的值