0

CargoとOfferの2つのテーブルがあります。特定のユーザーによるオファーがある有効なオファーの数とともに、すべての貨物をリストしたいだけです。テーブル構造は休閑中です:

Cargo-テーブル
CargoIdCargoTime ..

オファー - テーブル
OfferIdCargoIdUserId
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からのオファーがあった場合、ユーザー12のみを検索していても、カウントは2になります)

これを試してみてください:

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フィドル

これが現在の状況よりも効率的かどうかについては、通常、特定のケースによって異なります。テストして確認する必要があります。カーゴテーブルとオファーテーブルへのアクセスは1つしかないため、このクエリの方が効率的であると予想されますが、実際には状況によって異なります。

于 2012-06-03T01:02:24.453 に答える