如何使用多个表之间的连接来优化sql查询

时间:2016-11-16 19:00:11

标签: mysql sql postgresql

我有两张表具有以下结构 表A

itemId    categoryId     orderDate
==========================================
   1          23            2016-11-08
   1          23            2016-11-12
   1          23            2016-11-16

表B 具有结构

 categoryId  stock     price 
 ==========================================

  23          500       600

然而我想要的输出应该是这样的   结果C

 price         stock               orderdate                               qty
  600           500               2016-11-08 (first order date)            3 (3 time appearance in first table)

这是我到目前为止所尝试的内容

select b.price,b.stock from B b, A a
where b.categoryId = (
    select a.categoryId
    from A
    GROUP BY categoryId
    HAVING COUNT(categoryId)>1
    )
and (a.orderdate = (
  select MIN(orderdate)
  from A
  where categoryId = b.categoryId)
  ) 

我有以下结果

price         stock             orderdate                              
600           500               2016-11-08    

我不知道如何找到qty,因为它在第一张表中出现了3次。

5 个答案:

答案 0 :(得分:1)

我认为您希望表中的记录按项ID和类别ID分组,因此请在group by语句中包含这两个记录。然后你必须使用MIN,MAX,AVG,SUM等聚合其他列。我使用MIN,它将为你提供该特定列组中最小的数字,尽管在这种情况下你是否使用MIN无关紧要或MAX或AVG - 它们都是一样的。然后COUNT(*)将只计算组中的recrod数量。

此外,联接通常比使用逗号的列表更受欢迎。

SELECT a.itemid, a.categoryid, MIN(b.price), MIN(b.stock), min(a.orderdate), count(*) as qty
FROM a
INNER JOIN b ON a.categoryid = b.categoryid
GROUP BY a.itemid, a.categoryid

答案 1 :(得分:0)

您还需要选择COUNT(*)

答案 2 :(得分:0)

如何使用以下sql

select min(price), min(stock), min(orderDate), COUNT(categoryId) 
from A,B where A.categoryId = B.categoryId 
GROUP by A.categoryId

答案 3 :(得分:0)

您可以为子查询创建视图,并为其提供有意义的名称,例如CategoriesUsedInMultipleOrdersMostRecentOrderByCategory。这将优化'通过抽象出复杂性并使人类读者更容易理解来进行查询。

答案 4 :(得分:0)

这是使用适当的连接方法see Result的查询:

SELECT B.price, B.stock, MIN( A.orderDate ) AS orderdate, COUNT( * ) AS qty
FROM TableA A, TableB B
WHERE A.categoryId = B.CategoryId
GROUP BY A.categoryId, B.price, B.stock