Mysql选择行的值是否大于

时间:2017-04-11 18:09:21

标签: mysql sql

PUBLISHER

PB_ID

BOOK

BK_IDBK_PRICEPB_ID

1)我想获得所有从未有BK_PRICE > 10

的发布商的列表

2)我想获得所有从未有BK_PRICE < 10

的发布商的列表

3 个答案:

答案 0 :(得分:1)

1

SELECT PB_ID
     FROM PUBLISHER
    WHERE PB_ID NOT IN (
    SELECT DISTINCT PB_ID  
      FROM BOOK        
    WHERE BK_PRICE >= 10 );

2

SELECT PB_ID
  FROM PUBLISHER
 WHERE PB_ID NOT IN (
    SELECT DISTINCT PB_ID 
      FROM BOOK
     WHERE BK_PRICE <= 10 );

答案 1 :(得分:1)

您的第一个查询

Select P.PB_ID from PUBLISHER P join BOOK B on P.PB_ID = B.PB_ID where B.BK_PRICE  > 10

您的第二个查询

 Select P.PB_ID from PUBLISHER P join BOOK B on P.PB_ID = B.PB_ID where B.BK_PRICE  < 10

答案 2 :(得分:1)

与使用联接的其他响应不同,一旦发现价格> 1,这可以提前存在子查询。或者&lt;比给定出版商的10个。此外,每个其他回复都会给你错误的结果,因为出版商只需要一本高于或低于10的书就可以列入名单。  此外,由于没有连接,因此您不会为每本书重复多次或少于10次的pub_ID,并且不需要明确的。

但是,如果您需要Book中的数据,则需要加入,这种方法不起作用。但就性能而言,假设对键进行适当的索引,这种方法应该是最快的

由于我不清楚你是否想要一个或两个数据集,我使用了'union ALL'(它没有执行一个独特的;因此性能较低)结果并添加了一个pubClass列来表示哪些发布者有'noBookPrice&gt; 10'和那些'noBookPrice&lt; 10'

这使用了一个相关的子查询(请注意在子查询中如何引用P.?子查询如何知道P?(这是很酷的子查询,只能是一级深度)来组合{P}列表以及{b}的结果,以确保发布商不会出现一次图书价格> 10或<10。

SELECT P.Pub_ID, 'NoBookPrice>10' as PubClass
FROM Publisher P
WHERE not exists (SELECT 1 
                  FROM Book B 
                  WHERE BK_PRICE > 10 
                    and B.PB_ID = P.Pub_ID)
UNION ALL

SELECT Pub_ID, 'NoBookPrice<10' as PubClass
FROM Publisher P
WHERE not exists (SELECT 1 
                  FROM Book B 
                  WHERE BK_PRICE < 10 
                    and B.PB_ID = P.Pub_ID)