2

製品コード、または接続されている場合は代わりにバリエーション コードを返すクエリを使用して、製品テーブルにある変更された属性 (最新の変更された製品を選択するため) で並べ替えます。私の質問があります:

SELECT IF(Length(variation_code) > 0, variation_code, prod_code) AS prod_code, 
       product.modified, 
       price 
FROM   product 
       LEFT JOIN variation_row 
              ON product.prod_code = variation_row.product_code 
WHERE  prod_code IN (SELECT prod_code 
                     FROM   product) 
       AND price > 0 
GROUP  BY prod_code 
ORDER  BY modified DESC 
LIMIT  6 

問題は、同じ製品が連続して複数回変更された場合、結果セットに複数回表示される可能性があることです。

DISTINCT を使用して他の値と異なる値のみを取得することは知っていますが、prod_code を取得するために IF を使用しているため、クエリに実装できませんでした。

スクリプトを変更して同じ結果を返すが、異なる prod_codes を返す方法はありますか?

4

2 に答える 2

0

仮定

  • product.modified は日付です
  • product.modified と product.prod_code は製品内で一意です
  • product.price はこれら 2 つの属性に依存します
  • prod_code ごとに最新の変更されたエントリを取得したい

それから私の提案は

    SELECT S.prod_code
         , S.modified
         , P.price
      FROM product P
     INNER JOIN
           (SELECT case
                     when Length(variation_code) > 0 then variation_code
                     else prod_code
                   end AS prod_code
                 , -- use the most recent modification
                   max(product.modified) as modified
              FROM product 
              LEFT JOIN 
                   variation_row 
                     ON product.prod_code = variation_row.product_code 
             WHERE product.price > 0 
             GROUP BY
                   case
                     when Length(variation_code) > 0 then variation_code
                     else prod_code
                   end 
           ) S
             on S.prod_code = P.prod_code
            and S.modified = P.modified;

これは、Oracle、SQL Server、および PostgresSQL で機能するはずです。お使いのデータベース製品 (どの製品を使用していますか?) がこの構文をサポートしているかどうかわかりませんか?

元の回答の最初の 2 つのコメントを読んだ後に編集します

これは役に立ちますか

select IF(Length(variation_code) > 0, variation_code, prod_code) AS prod_code
     , p.modified
     , p.price
  from product p
 inner join
       (select m.prod_code
             , max(m.modified) as modified
          from product m
         group by
               m.prod_code
       ) m
         on p.prod_code = m.prod_code
        and p.modified = m.modified
  left join
       variation_row v
         on v.product_code = p.prod_code
 order by
       p.modified desc
 limit 6;
于 2013-03-01T08:54:11.943 に答える
0

私は自分でこれに対する解決策を作成することができました。これが最も効果的な方法かどうかはわかりませんが、機能します。

SELECT DISTINCT prod_code FROM (SELECT IF(Length(variation_code) > 0, variation_code, prod_code) AS prod_code, 
       product.modified, 
       price 
FROM   product 
       LEFT JOIN variation_row 
              ON product.prod_code = variation_row.product_code 
WHERE  prod_code IN (SELECT prod_code 
                     FROM   product) 
       AND price > 0 
GROUP  BY prod_code 
ORDER  BY modified DESC) AS a LIMIT 6;

これで私を助けてくれてありがとう!

于 2013-03-04T05:05:15.557 に答える