4

これには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 つの住所を持つ会社を返します。必要なのは、その国に住所を持つ会社を除外することです。

これどうやってするの?

4

3 に答える 3

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
于 2013-01-30T10:29:48.267 に答える