0

我有两张桌子 Cargo 和 Offer。我只想列出所有货物以及特定用户提供的有效报价的数量。表结构如下:

Cargo - 表
CargoId
CargoTime
..

Offer - 表
OfferId
CargoId
UserId
OfferStatu
..

在此系统中,用户可以为货物提供多个报价,但最新报价将被视为对特定用户有效。因此,如果 OfferStatu 为 1,则这指的是特定用户的先前优惠。

我编写SQL如下假设:

SELECT cargo.CargoId,cargo.CargoTime,COUNT(offer.OfferId) 
FROM cargo INNER join offer on offer.CargoId=cargo.CargoId
WHERE cargo.CargoId in
(
    select c.CargoId from cargo as c inner  join offer as o 
    on o.CargoId=c.CargoId
    WHERE o.UserId=12  
)
and offer.OfferStatu<>1
GROUP BY cargo.CargoId

但是这个查询在大约 1 秒内执行,这对我来说太多了。我知道有一种更有效的写作方式,但我现在正在苦苦挣扎。

4

1 回答 1

2

从您的问题中很难判断,但我假设您正在寻找与货物相关的所有报价的计数,即使它们不是由您正在搜索的特定用户提供的。(例如,如果货物有来自用户 10 和 12 的报价,那么计数将为 2,即使我们只搜索用户 12)

试试这个:

SELECT
  cargo.CargoId,
  cargo.CargoTime,
  COUNT(offer.OfferId) AS OfferCount
FROM
    cargo
  INNER JOIN
    offer
  ON
    offer.CargoId = cargo.CargoId
WHERE
  offer.OfferStatu <> 1
GROUP BY
  cargo.CargoId,
  cargo.CargoTime
HAVING
  SUM(CASE offer.UserId WHEN 12 THEN 1 ELSE 0 END) <> 0;

SQL 小提琴

至于这是否会比您目前拥有的更有效,这通常取决于您的具体情况,您必须进行测试才能确定。人们会期望这个查询更有效,因为只有一次对 cargo 和 offer 表的访问,但这确实取决于。

于 2012-06-03T01:02:24.453 回答