1

グループ内の最大値を持つ行を除くすべての行を検索するクエリを作成しようとしています。これまでのところ、最大値を持つ行を見つけるクエリがありますが、残りのすべての行を見つける必要があります。これは、2 つのデータベースとサンプル データを含む SQLFiddle です。最大行を見つけるクエリもあります。 http://sqlfiddle.com/#!2/514d2/33

SQLFiddle を使いたくない人のために... テーブル名: 一覧 テーブル名: 入札

SELECT listings.end_date, listings.user_id, listings.title, 
  listings.auc_fp, listings.id, listings.auc_image1
FROM listings 
JOIN bids b1 
ON b1.listing_id=listings.id 
LEFT JOIN bids b2 
ON b2.listing_id=listings.id AND b1.bid < b2.bid
WHERE b1.user_id = 1
AND b2.bid IS NULL
AND listings.end_date > NOW()
ORDER BY listings.list_ts DESC

上記は、最大行を見つけるクエリです。私は、listings.id=bids.listing_id で、リスト テーブルと入札テーブルを結合しようとしています。次に、ユーザー ($user またはユーザー "1") がそのリストに入札したすべての行を見つける必要があります。次に、ユーザーが最大入札額を持っているリストを除外する必要があります (これは上記のクエリが行うことです)。

私は当初、上記のクエリをサブクエリとして使用して、ユーザーが最大入札者であるリストを除外できると考えていました。しかし、それが最善の方法であるかどうかはわかりません。また、サブクエリはあまり得意ではありません。

4

1 に答える 1

1

以下のコメントに基づいて、回答が数回修正されたことに注意してください。

SELECT
    lst.end_date,
    lst.title,
    lst.auc_fp,
    lst.id as listing_id,
    lst.auc_image1,
    b.user_id as bid_user_id,
    b.bid as bid_amount,
    maxbids.maxbid as maxbid_for_listing
FROM listings lst
INNER JOIN
(
    SELECT listing_id, MAX(bid) maxbid
    FROM bids b
    GROUP BY listing_id
) maxbids ON lst.id = maxbids.listing_id
INNER JOIN bids maxusers ON maxusers.bid = maxbids.maxbid AND maxusers.listing_id = maxbids.listing_id
INNER JOIN bids b ON
    maxbids.listing_id = b.listing_Id AND
    b.bid < maxbids.maxbid AND
    b.user_id <> maxusers.user_id
WHERE lst.end_date > NOW()
ORDER BY lst.list_ts DESC
于 2012-12-29T21:46:02.223 に答える