0

このクエリがあります (3 つのサブクエリすべてが同じ行から異なる列を選択していることに注意してください)。product_bid基本的に、行の横にある最大の日付で行を取得したいと考えていますproduct

SELECT 
p.product_id,
p.product_title, 
(SELECT b.bid_id FROM product_bids b WHERE b.bid_product_id=p.product_id ORDER BY b.bid_date DESC LIMIT 1) AS bid_id,
(SELECT b.bid_date FROM product_bids b WHERE b.bid_product_id=p.product_id ORDER BY b.bid_date DESC LIMIT 1) AS bid_date,
(SELECT b.bid_amount FROM product_bids b WHERE b.bid_product_id=p.product_id ORDER BY b.bid_date DESC LIMIT 1) AS bid_amount

FROM product p

WHERE p.product_auction_id=325

のPKを取得するためにサブクエリを1回実行しproduct_bids、それに参加する方法(サブクエリの結果)またはこれを行うクリーンな方法はありますか?

補足: クエリ オプティマイザーはとにかくこれを認識し、重要性を下げますか?

ありがとう

4

2 に答える 2

1

各製品の最新の入札日を選択するサブクエリを使用して、テーブルを結合できます。

SELECT p.product_id, b.bid_id, b.bid_date, b.bid_amount
FROM   product_bids AS b NATURAL JOIN (
         SELECT   bid_product_id, MAX(bid_date) AS bid_date
         FROM     product_bids
         GROUP BY bid_product_id
       ) AS t
  JOIN product AS p ON p.product_id = b.bid_product_id
WHERE  p.product_auction_id = 325
于 2012-05-31T10:17:38.617 に答える
0

1 つの SQL クエリ内で行うのは難しいかもしれませんが、私はこの提案をしています。最初に product_bids から最大日付を選択してから、次のような 2 番目のクエリを作成します。

select p.product_id, p.product_title, b.bid_id, b.bid_date, b.bid_amount
from product p
inner join product_bids b on b.bid_date = @yourselectedbiddate

これはまったく同じデータを取得する必要がありますが、パフォーマンスははるかに高くなります。@yourselectedbiddate は、正確に 1 つのレコードが持つ値になる必要があることに注意してください。そうしないと、不要な行が増えることになります。これが当てはまらない場合 (つまり、1 つが一番上にあることに依存できないことを意味します)、最大の日付を持つレコードのどれが最初に来るかを定義していないため、提案に同様の問題があります。

于 2012-05-31T10:16:47.617 に答える