2

次の解決策を探しています。

  1. users テーブルに移動し、サイトにアイテムをリストしたユーザーを見つけます。この users テーブルには、オークションに関する列はありません。代わりに、キーを使用してアカウント テーブルに接続されます (アカウントでは、この列はユーザ​​ーと呼ばれます)。

  2. これらの ID (オークションにアイテムを出品したユーザー) から、アカウントの残高を見つける必要があります。これは、アカウント テーブルにもあります。残高は、operation_amount という列に含まれています。また、ユーザーの残高がプラスかマイナスかを示す operation_type という別の列もあります。たとえば、操作タイプ = 1 の場合、彼の残高はマイナスであり、操作タイプ = 2 の場合、彼の残高はプラスです。

tmpinvoiceこれで、amount という列がある別のテーブルができました。これは、ユーザーがサイト管理者に支払う必要のある料金を示しています。

これを考えると、彼が合計でいくら支払わなければならないかを計算する必要があります。たとえば、ユーザーの残高が 200 ドルの場合、に基づいてマイナスかプラスかを確認する必要がありoperation_typeます。

だから私はクエリを持っていますこれはレコードに対してのみ行います

SELECT u.id AS id_user, u.nick,
  CASE ac.operation_type WHEN 1 THEN ac.operation_amount - tm.amount
                         WHEN 2 THEN ac.operation_amount + tm.amount
                                ELSE 'N/A' END AS `fee`                         
FROM auctionbg_search.accounts AS ac    
    LEFT JOIN auctionbg_search.users AS u ON TRUE
        AND u.id = ac.user
    LEFT JOIN auctionbg_search.auctions AS a ON TRUE
        AND a.id = ac.auction
    LEFT JOIN auctionbg_search.tmpinvoice AS tm  ON TRUE    
WHERE TRUE
  AND tm.amount = ac.operation_amount

ここで私が受け取っている結果

http://gyazo.com/3d7e7f52ee14d21cc8c8d33b6bbc479a

はい、しかしこれは列の1つの値に対してのみ「料金」を計算します。ユーザーが複数の値を持っている場合はどうなりますか

このユーザーのように:

http://gyazo.com/c3bdb29fa235044ab888dc0385bbcdbd

その特定のユーザーの operation_amount から合計金額を計算しtmpinvoice、その合計金額から削除する必要があります。

友人が使うように言った

IF(SUM(ac.operation_amount), IS NULL , 0, sum(ac.operation_amount) 

+と-の両方の場合の2つの時間アカウント(テーブル)を結合するには

+ で 1 回、 - で 2 回参加

しかし、私は意志がどのように見えるかわかりません:)

4

1 に答える 1

2

SUM 関数内で CASE 式を使用します。

   SELECT u.id AS id_user, u.nick,
     SUM(CASE ac.operation_type WHEN 1 THEN ac.operation_amount - tm.amount У
                                WHEN 2 THEN ac.operation_amount + tm.amount
                                       ELSE 'N/A' END) AS `fee`
    FROM auctionbg_search.accounts AS ac
      LEFT JOIN auctionbg_search.users AS u ON TRUE AND u.id = ac.user 
      LEFT JOIN auctionbg_search.auctions AS a ON TRUE AND a.id = ac.auction
      LEFT JOIN auctionbg_search.tmpinvoice AS tm  ON TRUE  
    WHERE TRUE AND tm.amount = ac.operation_amount
    GROUP BY u.id, u.nick       

デモを見るSQLFiddle

于 2013-08-05T07:36:33.860 に答える