【问题标题】:Rewriting SQL of counting offers made by user重写统计用户提供的SQL
【发布时间】:2012-06-02 22:24:19
【问题描述】:

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

货物 - 表格
货物编号
货运时间
..

优惠 - 表格
报价 ID
货物编号
用户ID
报价状态
..

在此系统中,用户可以为货物提供多个报价,但最新报价将被视为对特定用户有效。因此,如果 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 秒内执行,这对我来说太长了。我知道有一种更有效的写作方式,但我现在正在苦苦挣扎。

【问题讨论】:

    标签: sql performance join count


    【解决方案1】:

    从您的问题中很难判断,但我假设您正在寻找与货物相关的 所有 报价的计数,即使它们不是由您的特定用户提供的'正在寻找。 (例如,如果货物有来自用户 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 Fiddle)

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

    【讨论】:

    • 完美,我非常感谢您的努力,这正是我想要的。您的解决方案现在只需 0.031 秒。
    猜你喜欢
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 2017-06-20
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多