对于每个数字,查找仅使用该数字发布的广告

For each number find ads that was published with only that number

我的数据库应用程序包含树 tables phoneadphone_ad。 每个广告可以在 phone_ad table.

中发布一个 phone 或更多

phone:

---------------------
ph_id | number
---------------------
0     | xxx-xxx-xxxx
1     | yyy-yyy-yyyy
2     | zzz-zzz-zzzz
---------------------

广告:

-----------------------
ad_id   | ad_text
-----------------------
11      | text_1
12      | text_2
13      | text_3
-----------------------

phone_ad:

------------------
ad_id  | ph_id
------------------
11      | 0
12      | 0
12      | 2
13      | 0
14      | 1
14      | 2
------------------

我正在尝试为每个数字(假设 ph_id = 0 的数字)查找仅使用该数字发布的广告。这意味着在这种情况下,广告有 ad_id = 11 和 ad_id = 13。我已经尝试了下面的查询,但它似乎不起作用

SELECT ad_id 
FROM phone_ad 
WHERE ph_id = 0 AND NOT EXISTS (SELECT ad_id FROM phone_ad WHERE ph_id <> 0)

您可以在 sabquery 上使用 join 作为组的结果 ad_id with countdistinct ph_id = 1

select p.ad_id 
from phone_ad p
INNER JOIN  (
  SELECT ad_id 
  FROM phone_ad 
  GROUP BY  ad_id
  having count(distinct ph_id) =1 
) t on t.ad_id  = p.ad_id 
WHERE ph_id = 0

你快到了。您只需要 关联 子查询与外部查询,以便它们与相同的 ad_id:

相关
SELECT ad_id 
FROM phone_ad p
WHERE 
    ph_id = 0 
    AND NOT EXISTS (
        SELECT ad_id 
        FROM phone_ad p1 
        WHERE 
            p1.ad_id = p.ad_id     -- correlation on ad_id
            AND p1.ph_id <> p.ph_id
    )