繁体   English   中英

来自同一城市的不同表的MySQL查询

[英]MySQL query from different tables with same city

表格:

Processor(_pid_, brand, clockSpeed, supplierCity)

Memory(_mid_, brand, capacity, supplierCity)

Harddrive(_hdid_, brand, capacity, RPM, supplierCity)

PC(_pcid_, _mid_, _pid_, _hdid_, model, price, cost)

我正在尝试建立一个查询:

Find's the PC model whose price is less than 1000 pounds and for which 
the memory and the processor are supplied from the same city

我的当前查询返回相同结果的多次重复:

SELECT pc.model FROM pc, memory, processor WHERE
memory.supplierCity=processor.supplierCity AND pc.price<1000;

在此处输入图片说明

SELECT  *
FROM    pc
WHERE   price < 1000
        AND EXISTS
        (
        SELECT  NULL
        FROM    processor p
        JOIN    memory m
        USING   (supplierCity)
        WHERE   (p._pid_, m._mid_) = (pc._pid_, pc._mid_)
        )

正如vkp在评论中说的那样,请尽量避免使用逗号表示法( 这种情况有用且不仅懒惰的情况通常很简单,也很少见 )。 而且,就像vkp所说的那样, pc没有加入,如下所示。

SELECT pc.model 
FROM pc
   INNER JOIN memory ON pc.`_mid_` = memory.`_mid_`
   INNER JOIN processor ON pc.`_pid_` = processor.`_pid_` 
WHERE pc.price<1000 
   AND memory.supplierCity=processor.supplierCity
;

AND部分可以移到第二个ON子句,并且根据您的数据可能会更有效; 但是从概念上讲,这更容易解释。

它获取所有PC记录的列表及其相应的内存和处理器,然后保留结果,其中PC的价格低于1000,并且内存和处理器由同一座城市提供。 但是,由于MySQL通常是如何处理查询的,很有可能会首先获得价格低于1000的pc条目列表,然后为每个条目查找内存和处理器。

暂无
暂无

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

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