1

オークションに複数の製品を含めることができるスクリプトに取り組んでいます。製品には通常価格があり、オークションのすべての製品について合計され、オークションの「パッケージ」通常価格として返されます。

私の問題は、テスト オークションの通常の価格が 150 ドルであるのに、クエリが 300 ドルを返すということです。これは、どこかで間違いを犯したことを意味します。私は一晩中解決策を見つけようとしましたが、うまくいきませんでした。誰も手がかりを持っていますか?

SELECT 
    a.AuctionName as A_name, 
    c.CategoryName as C_name, 
    a.AuctionEndDate as A_enddate, 
    a.AuctionOfferPrice as A_price, 
    SUM(p.ProductPrice) as A_normalprice, 
    s.StoreName as S_name 
FROM A_Auctions a 
RIGHT JOIN 
    A_Categories c 
    ON c.CategoryID = :category_id 
INNER JOIN 
    P_ProductsAuctions ppa 
    ON ppa.Auct_AuctionID = a.AuctionID 
RIGHT JOIN 
    P_Products p 
    ON p.ProductID = ppa.Prod_ProductID 
RIGHT JOIN 
    P_Attributes pa 
    ON pa.Cate_CategoryID = c.CategoryID 
RIGHT JOIN 
    P_AttributeValues pav 
    ON pa.AttributeID = pav.Attr_AttributeID 
LEFT JOIN 
    S_Stores s ON a.Stor_StoreID = s.StoreID 
WHERE 
    a.Cate_CategoryID = c.CategoryID 
    AND ((pa.InternationalName = 'param1' AND pav.AttributeValue = 'value1') OR (pa.InternationalName = 'param1' AND pav.AttributeValue = 'value2')) 
    AND ((pa.InternationalName = 'param2' AND pav.AttributeValue = 'value1') OR (pa.InternationalName = 'param1' AND pav.AttributeValue = 'value2'))
GROUP BY 
    p.ProductID, a.AuctionID, pa.AttributeID ORDER BY a.AuctionID DESC 
LIMIT 0,20

これが私のテーブル構造です:

A_オークション:

AuctionID   int(15)         
AuctionName varchar(256)        
AuctionDescription  text        
AuctionPicture  text        
AuctionOfferPrice   decimal(15,2)           
AuctionMinimumPrice decimal(15,2)           
AuctionStartDate    datetime            
AuctionEndDate  datetime            
AuctionTimeInterval time            
AuctionNextInterval datetime            
AuctionPercentageChange decimal(5,2)            
Cate_CategoryID int(15)         
Prod_ProductID  int(15)         
Stor_StoreID    int(15)         
StUs_StoreUserID    int(15)         
date_added  datetime

P_製品:

ProductID   int(15)         
ProductName varchar(256)        
ProductDescription  text        
ProductPictureLink  longtext    
ProductPrice    decimal(25,2)           
ProductStatus   int(3)          
ProductGroupID  int(15)         
Cate_CategoryID int(15)         
StUs_UserID int(15)         
added_date  datetime

P_ProductsAuctions (Auctions と Products 間の 1:Many 関係を格納):

Auct_AuctionID  int(15)         
Prod_ProductID  int(15) 

P_Attributes (製品のさまざまなバリエーションの表):

AttributeID int(15)         
Auct_AuctionID  int(15)         
Cate_CategoryID int(15)         
AttributeName   varchar(256)        
InternationalName   varchar(256)

編集: - 問題は P_Attributes と P_AttributeValues のパラメーターにあるようです。クエリにパラメーターを 1 つ追加すると、価格が 150 ドル高くなるため、1 つのパラメーターで 300 ドル、2 つのパラメーターで 450 ドル、3 つのパラメーターで 600 ドル、すぐ...

編集2:

ここで SQLfiddle を見つけてください: http://sqlfiddle.com/#!2/d223f/1

編集3:

私の出力は次のようになります。

A_NAME -> テスト中

C_NAME -> テスト

A_ENDDATE -> 2012 年 9 月 9 日 22:00:00-0400

A_PRICE -> 250

A_通常価格 -> 150

S_NAME -> (ヌル)

前もって感謝します、

デンラウ。

4

1 に答える 1

0

属性テーブルに問題があることは正しいです。問題は、複数の属性があり、属性ごとに別の行が返されることです。GROUP BY はこれらの行を結合し、すべての価格を SUM に追加します。

SELECT 句と GROUP BY 句に pav.AttributeValue を追加するだけで、サイズ 43 で 150 ドル、サイズ 44 で 150 ドルという動作を確認できます。

製品 ID を取得するためにサブセレクトを行うには、これをリファクタリングする必要があります。私はあなたのスキーマを完全には理解していませんが、次のようなものが必要になるかもしれません:

    SELECT
  a.AuctionID ,
  c.categoryid,
  p.ProductID ,
  a.AuctionID ,
  ppa.Auct_AuctionID,


  s.storeID,

  a.AuctionName AS A_name,
  c.CategoryName AS C_name,
  a.AuctionEndDate AS A_enddate,
  a.AuctionOfferPrice AS A_price,
  sum(p.ProductPrice) as A_normalprice,
  p.ProductPrice AS A_normalprice,
  s.StoreName AS S_name
FROM
  A_Auctions a
RIGHT JOIN
  A_Categories c
  ON c.CategoryID = '1'
INNER JOIN
  P_ProductsAuctions ppa
  ON ppa.Auct_AuctionID = a.AuctionID
LEFT JOIN
  P_Products p
  ON p.ProductID = ppa.Prod_ProductID
LEFT JOIN
  P_Attributes pa
  ON pa.Cate_CategoryID = c.CategoryID
LEFT JOIN
  S_Stores s
  ON a.Stor_StoreID = s.StoreID

INNER JOIN
  (SELECT distinct Cate_CategoryID FROM P_AttributeValues pav INNER JOIN P_Attributes pa ON pa.AttributeID = pav.Attr_AttributeID 
    WHERE
      (pa.InternationalName = 'size'
      AND pav.AttributeValue = '43')
    OR
      (pa.InternationalName = 'size'
      AND pav.AttributeValue = '44')
  ) pav2  ON pav2.Cate_CategoryID = c.CategoryID 

WHERE
a.Cate_CategoryID = c.CategoryID

GROUP BY productid, auctionid, categoryid
ORDER BY
  a.AuctionID DESC
LIMIT 0,20
于 2012-09-11T15:34:06.193 に答える