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

时间:2019-11-25 14:43:16

标签: mysql sql not-exists

我的数据库应用程序包含树表phoneadphone_ad。 每个广告可以用一个或多个电话发布在phone_ad表中。

电话:

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

ad:

-----------------------
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)

2 个答案:

答案 0 :(得分:1)

您快到了。您只需将子查询与外部查询进行关联,以便它们与相同的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
    )

答案 1 :(得分:0)

您可以在sabquery上使用join来通过ad_id使用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