在没有连接和使用子查询的情况下编写查询

时间:2016-01-18 10:18:54

标签: mysql sql join

我想用IN()ANY()运算符等子查询重写连接查询。

数据集:

*categories*
categoryID name 
         5 ROD    
         7 CEMENT 

*products*
productID categoryID name      
        7          5 BSRM 10mm 
        9          5 KSRM 5mm  
       10          5 Julius    
       11          7           
       12          5 BSRM 25mm 

*sale_products*   
saleID productID 
   118         9 
   119         9 
   120         9 
   121         9 
   122        12 
   123        12 
   124        12 

这是我查询已售出的saleID,产品名称和类别名称的查询。 enter image description here

我的查询是:

SELECT sale_products.saleID, products.name, categories.name
FROM categories
  INNER JOIN (products, sale_products)
    ON  categories.categoryID = products.categoryID
    AND products.productID = sale_products.productID 

现在我想要没有连接和子查询方法的结果集。

我试着这样:

SELECT categories.name
FROM categories
WHERE categories.categoryID IN
          (SELECT products.categoryID
           FROM products
           WHERE products.productID in
               (SELECT sale_products.productID FROM sale_products))

此查询仅提供类别名称,但我还需要saleID,产品名称。

1 个答案:

答案 0 :(得分:1)

您的原始查询看起来很奇怪。你为什么要加入产品和sale_products?

最好是:

select sp.saleid, p.name as product, c.name as category
from sale_products sp
join products p on p.productid = sp.productid
join categories c on c.categoryid = p.categoryid;

这是显示数据的直接方式。您可以使用子查询,但我认为没有任何意义:

select 
  sp.saleid
  (
    select p.name
    from products p
    where p.productid = sp.productid
  ) as product, 
  (
    select c.name
    from categories c 
    where c.categoryid = p.categoryid
  ) as category
from sale_products sp;

这是另一个带子查询的查询。再次对使用表上的直接连接的简单查询没有任何好处。

select sp.saleid, p.name as product, c.name as category
from sale_products sp
join (select productid, name from products) p on p.productid = sp.productid
join (select categoryid, name from categories) c on c.categoryid = p.categoryid;