繁体   English   中英

MySQL min函数在where子句中,它如何工作?

[英]MySQL min function in where clause, how does it works?

我有这个查询:

select
    s_acctbal, s_name, n_name, p_partkey, p_mfgr, 
    s_address, s_phone, s_comment
from 
    part, supplier, partsupp, nation, region
where 
    p_partkey = ps_partkey
    and s_suppkey = ps_suppkey
    and p_size = 15
    and p_type like '%BRASS'
    and s_nationkey = n_nationkey
    and n_regionkey = r_regionkey
    and r_name = 'EUROPE'
    and ps_supplycost = (
        select 
            min(ps_supplycost)
        from 
            partsupp, supplier, nation, region
        where 
            p_partkey = ps_partkey
            and s_suppkey = ps_suppkey
            and s_nationkey = n_nationkey
            and n_regionkey = r_regionkey
            and r_name = 'EUROPE'
    )
order by 
    s_acctbal desc, n_name, s_name, p_partkey;

第一个疑问:

为什么在子选择(内部选择)中再次设置r_name='EUROPE' 我知道p_partkey = ps_partkey赋予此子选择与p_partkey = ps_partkey选择相同的条件,因此不需要再次进行设置吗?

第二个疑问:

内部选择中的行r_name = 'EUROPE'在查询中有一些区别(我看不到,但我想知道)。 如果我计算原始查询的结果,则有460个条目。 而且如果我得到内部选择的r_name = 'EUROPE' ,那么我只有144个条目。 这看起来很疯狂,带有这种情况(因此有更多的限制),并且比我摆脱这种情况时获得了更多的结果。 为什么会这样?

仅供参考(也许这有助于为什么我对此查询不满意):

原始查询返回:

s_acctbal s_name             n_name         p_partkey p_mfgr         s_address                              s_phone         s_comment                                                                                      
--------- ------------------ -------------- --------- -------------- -------------------------------------- --------------- ---------------------------------------------------------------------------------------------- 
9938.53   Supplier#000005359 UNITED KINGDOM 185358    Manufacturer#4 QKuHYh,vZGiwu2FWEJoLDx04               33-429-790-6131 blithely silent pinto beans are furiously. slyly final deposits acros

9937.84   Supplier#000005969 ROMANIA        108438    Manufacturer#1 ANDENSOSmk,miq23Xfb5RWt6dvUcvt6Qa      29-520-692-3537 carefully slow deposits use furiously. slyly ironic platelets above the ironic 

9936.22   Supplier#000005250 UNITED KINGDOM 249       Manufacturer#4 B3rqp0xbSEim4Mpy2RH J                  33-320-228-2957 blithely special packages are. stealthily express deposits across the closely final instructi

9923.77   Supplier#000002324 GERMANY        29821     Manufacturer#4 y3OD9UywSTOk                           17-779-299-1839 quickly express packages breach quiet pinto beans. requ

9871.22   Supplier#000006373 GERMANY        43868     Manufacturer#5 J8fcXWsTqM                             17-813-485-8637 never silent deposits integrate furiously blit

9870.78   Supplier#000001286 GERMANY        81285     Manufacturer#2 YKA,E2fjiVd7eUrzp2Ef8j1QxGo2DFnosaTEH  17-516-924-4574 final theodolites cajole slyly special, 

9870.78   Supplier#000001286 GERMANY        181285    Manufacturer#4 YKA,E2fjiVd7eUrzp2Ef8j1QxGo2DFnosaTEH  17-516-924-4574 final theodolites cajole slyly special, 

9852.52   Supplier#000008973 RUSSIA         18972     Manufacturer#2 t5L67YdBYYH6o,Vz24jpDyQ9               32-188-594-7038 quickly regular instructions wake-- carefully unusual braids into the expres

9847.83   Supplier#000008097 RUSSIA         130557    Manufacturer#2 xMe97bpE69NzdwLoX                      32-375-640-3593 slyly regular dependencies sleep slyly furiously express dep

9847.57   Supplier#000006345 FRANCE         86344     Manufacturer#1 VSt3rzk3qG698u6ld8HhOByvrTcSTSvQlDQDag 16-886-766-7945 silent pinto beans should have to snooze carefully along the final reques

9847.57   Supplier#000006345 FRANCE         173827    Manufacturer#2 VSt3rzk3qG698u6ld8HhOByvrTcSTSvQlDQDag 16-886-766-7945 silent pinto beans should have to snooze carefully along the final reques

没有内部选择条件r_name = 'EUROPA'返回:

s_acctbal s_name             n_name         p_partkey p_mfgr         s_address                               s_phone         s_comment                                                                             
--------- ------------------ -------------- --------- -------------- --------------------------------------- --------------- ------------------------------------------------------------------------------------- 
9938.53   Supplier#000005359 UNITED KINGDOM 185358    Manufacturer#4 QKuHYh,vZGiwu2FWEJoLDx04                33-429-790-6131 blithely silent pinto beans are furiously. slyly final deposits acros

9817.10   Supplier#000002352 RUSSIA         124815    Manufacturer#2 4LfoHUZjgjEbAKw TgdKcgOc4D4uCYw         32-551-831-1437 blithely pending packages across the ironic accounts grow slyly after the furiously

9721.95   Supplier#000008757 UNITED KINGDOM 156241    Manufacturer#3 Atg6GnM4dT2                             33-821-407-2995 ironic, even dolphins above the furiously ironic foxes sleep slyly around the caref

9643.55   Supplier#000005148 ROMANIA        107617    Manufacturer#1 kT4ciVFslx9z4s79p Js825                 29-252-617-4850 doggedly even ideas boost furiously against the furiously express

9612.94   Supplier#000003228 ROMANIA        198189    Manufacturer#4 KDdpNKN3cWu7ZSrbdqp7AfSLxx,qWB          29-325-784-8187 carefully pending accounts serve. furiously close deposits boost slyly. q

9571.83   Supplier#000004305 ROMANIA        179270    Manufacturer#2 qNHZ7WmCzygwMPRDO9Ps                    29-973-481-1831 furiously final deposits 

9558.10   Supplier#000003532 UNITED KINGDOM 88515     Manufacturer#4 EOeuiiOn21OVpTlGguufFDFsbN1p0lhpxHp     33-152-301-2164 daring, sly accounts breach about th

9280.27   Supplier#000007194 ROMANIA        47193     Manufacturer#3 zhRUQkBSrFYxIAXTfInj vyGRQjeK           29-318-454-2133 slyly ironic requests despite the unusual ins

9249.35   Supplier#000003973 FRANCE         26466     Manufacturer#1 d18GiDsL6Wm2IsGXM,RZf1jCsgZAOjNYVThTRP4 16-722-866-1658 quickly ironic sauternes use b

9249.35   Supplier#000003973 FRANCE         33972     Manufacturer#1 d18GiDsL6Wm2IsGXM,RZf1jCsgZAOjNYVThTRP4 16-722-866-1658 quickly ironic sauternes use b

9201.47   Supplier#000009690 UNITED KINGDOM 67183     Manufacturer#5 CB BnUTlmi5zdeEl7R7                     33-121-267-9529 blithely unusual accounts integrate slyly. platelets 

9094.57   Supplier#000004582 RUSSIA         39575     Manufacturer#1 WB0XkCSG3r,mnQ n,h9VIxjjr9ARHFvKgMDf    32-587-577-1351 asymptotes above the slyly even requests haggle furiously about the regular accounts

最后没有(ps_supplycost = ...)的查询返回:

s_acctbal s_name             n_name         p_partkey p_mfgr         s_address                              s_phone         s_comment                                                                                          
--------- ------------------ -------------- --------- -------------- -------------------------------------- --------------- -------------------------------------------------------------------------------------------------- 
9984.69   Supplier#000008875 ROMANIA        13872     Manufacturer#3 hRdOqKqyU,sHq                          29-132-904-4395 ironic instructions among the ironic requests boost at the ironic, ironic deposits. quick

9955.05   Supplier#000008810 UNITED KINGDOM 73795     Manufacturer#2 ,Ot93zDXOFSjWSKsKrT7XJ4YPCP,A          33-527-478-5988 furiously unusual pinto beans nag ironic platelets. regular, bold fox

9955.05   Supplier#000008810 UNITED KINGDOM 81285     Manufacturer#2 ,Ot93zDXOFSjWSKsKrT7XJ4YPCP,A          33-527-478-5988 furiously unusual pinto beans nag ironic platelets. regular, bold fox

9938.53   Supplier#000005359 UNITED KINGDOM 185358    Manufacturer#4 QKuHYh,vZGiwu2FWEJoLDx04               33-429-790-6131 blithely silent pinto beans are furiously. slyly final deposits acros

9937.84   Supplier#000005969 ROMANIA        108438    Manufacturer#1 ANDENSOSmk,miq23Xfb5RWt6dvUcvt6Qa      29-520-692-3537 carefully slow deposits use furiously. slyly ironic platelets above the ironic 

9936.22   Supplier#000005250 UNITED KINGDOM 249       Manufacturer#4 B3rqp0xbSEim4Mpy2RH J                  33-320-228-2957 blithely special packages are. stealthily express deposits across the closely final instructi

9923.77   Supplier#000002324 GERMANY        29821     Manufacturer#4 y3OD9UywSTOk                           17-779-299-1839 quickly express packages breach quiet pinto beans. requ

9871.22   Supplier#000006373 GERMANY        43868     Manufacturer#5 J8fcXWsTqM                             17-813-485-8637 never silent deposits integrate furiously blit

9870.78   Supplier#000001286 GERMANY        81285     Manufacturer#2 YKA,E2fjiVd7eUrzp2Ef8j1QxGo2DFnosaTEH  17-516-924-4574 final theodolites cajole slyly special, 

9870.78   Supplier#000001286 GERMANY        181285    Manufacturer#4 YKA,E2fjiVd7eUrzp2Ef8j1QxGo2DFnosaTEH  17-516-924-4574 final theodolites cajole slyly special, 

9852.52   Supplier#000008973 RUSSIA         18972     Manufacturer#2 t5L67YdBYYH6o,Vz24jpDyQ9               32-188-594-7038 quickly regular instructions wake-- carefully unusual braids into the expres

9847.83   Supplier#000008097 RUSSIA         130557    Manufacturer#2 xMe97bpE69NzdwLoX                      32-375-640-3593 slyly regular dependencies sleep slyly furiously express dep

9847.57   Supplier#000006345 FRANCE         66344     Manufacturer#4 VSt3rzk3qG698u6ld8HhOByvrTcSTSvQlDQDag 16-886-766-7945 silent pinto beans should have to snooze carefully along the final reques

9847.57   Supplier#000006345 FRANCE         86344     Manufacturer#1 VSt3rzk3qG698u6ld8HhOByvrTcSTSvQlDQDag 16-886-766-7945 silent pinto beans should have to snooze carefully along the final reques

9847.57   Supplier#000006345 FRANCE         173827    Manufacturer#2 VSt3rzk3qG698u6ld8HhOByvrTcSTSvQlDQDag 16-886-766-7945 silent pinto beans should have to snooze carefully along the final reques

9836.93   Supplier#000007342 RUSSIA         4841      Manufacturer#4 JOlK7C1,7xrEZSSOw                      32-399-414-5385 final accounts haggle. bold accounts are furiously dugouts. furiously silent asymptotes are slyly

谢谢

看来您正在尝试为p_size = 15和p_type的任何商品(例如'%BRASS')找到最便宜的供应成本。您的子查询没有此限制...因此您的主查询可能有100个产品(通过这样),但您的SUBQUERY可能有50,000个条目,因为您并没有将其限制为仅具有相同产品类型的p_size = 15的那些耗材的相同标准。

您可能需要让您的内部查询还包含p_type和GROUP BY,以便应用MIN(),然后将其作为连接的基础。 我已经按照您的命名约定用表/字段关系的最佳来宾重写了查询...

另外,请注意我的内部查询显式使用alias.field名称引用。 希望不要与外部查询的相同字段名称/值混淆。 我可能不太准确,但我认为您的要求与我很接近。

select
      s_acctbal, 
      s_name, 
      n_name, 
      p_partkey, 
      p_mfgr, 
      s_address, 
      s_phone, 
      s_comment,
      p_type,
      ps_supplycost
   from 
      part
         JOIN partsupp
            ON p_partkey = ps_partkey 
            JOIN supplier
               ON ps_suppkey = s_suppkey 
               JOIN nation
                  ON s_nationkey = n_nationkey 
                  JOIN region
                     ON n_regionkey = r_regionkey
                     AND r_name = 'EUROPE'

         JOIN ( SELECT 
                      P.p_type,
                      MIN( PS.ps_supplycost ) MinCost
                   from 
                      part P
                         JOIN partsupp PS
                            ON P.p_partkey = PS.ps_partkey
                            JOIN supplier S
                               ON PS.ps_suppkey = S.s_suppkey 
                               JOIN nation N
                                  ON S.s_nationkey = N.n_nationkey 
                                  JOIN region R
                                     ON N.n_regionkey = R.r_regionkey
                                     AND R.r_name = 'EUROPE' 
                   where 
                          P.p_size = 15
                      AND P.p_type like '%BRASS'
                   ) MinPerType
            ON p_type = MinPerType.p_type
            AND ps_supplycost = MinPerType.MinCost        
   where 
          p_size = 15
      AND p_type like '%BRASS'
   order by 
      s_acctbal desc, 
      n_name, 
      s_name, 
      p_partkey;

因此,如您所见,用于检测最低价格的内部查询基于每个“ P_TYPE”值。 如果处理乐器,黄铜或乐器,黄铜等用于制造,水暖等的黄铜物品,则每种“类型”的价格都可能相差悬殊,因此您正在寻找ex:

BRASS #1  (small thing) that supply cost range $1.50 - $2.15  vs
BRASS #83 (huge item) that supply cost range $42.00 - $48.50

您将永远不会被挑选出BRASS#83,因为它永远不会接近$ 1.50的价格标签。 但是,您可能有10个价格为$ 1.50的BRASS#1供应商,以及7个价格为$ 42.00的BRASS#83供应商,因此您的最终查询将返回17条记录(在此示例中)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM