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

时间:2013-01-30 10:11:00

标签: mysql group-by notin

我正在使用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

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

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

我该怎么做?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

试试这个:

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