【问题标题】:For each number find ads that was published with only that number对于每个号码,查找​​仅使用该号码发布的广告
【发布时间】:2020-03-20 21:23:29
【问题描述】:

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

电话:

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

电话广告:

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

【问题讨论】:

    标签: mysql sql not-exists


    【解决方案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
        )
    

    【讨论】:

    • 你的意思是p1.ad_id = p.ad_id 。有效。谢谢
    • 欢迎@adeladl,感谢您发现错字,我已修正。
    【解决方案2】:

    您可以使用 sabquery 上的连接来获取按 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多