bugfix> mysql > 投稿

私は、重量や国などのいくつかの基準に基づいてデータベースから最も低い値を選択することになっている送料計算機のこのクエリを持っています。クエリは、条件に一致する1つまたは複数のShippingProviderIdの最初の最低値を取得することを目的としています。

問題は、Group byクエリがShippingCostテーブルからの複数の行の結果を混合し、強打からヒンジをスローすることです。 PriceとShippingCostIdを同じ行から取得する必要があります。この結果の混合を防ぐにはどうすればよいですか?おそらくGroup Byは必要なものではないのでしょうか?

SELECT MIN(s1.Price), s1.ShippingCostId, s1.Weight, s2.CoD, s2.Artnr, s2.CoD, 
s2.Regular, s2.ShippingProviderId, s3.ProviderName FROM ShippingCost s1
INNER JOIN ShippingProvider s2 ON s1.ShippingProviderId = s2.ShippingProviderId 
INNER JOIN ShippingProviderTranslations s3 ON (s2.ShippingProviderId = s3.ShippingProviderId AND s3.Language = 'xx') 
WHERE CountryId = 123 AND (Weight >= 0.5 AND Weight <= 50) AND s2.Regular = 0
GROUP BY s2.ShippingProviderId

MIN()式を削除すると、行は混合されなくなりますが、最小値はShippingCostIdが高く、後で追加された(主キーである)ため、最小値は見つかりません。重量のMIN()式を追加したり、重量で並べ替えたりすることもできません。さまざまなアプローチを試してみましたが、困惑しています。

助言がありますか?

回答 1 件
  • 列でグループ化しないための選択ではなく、最小価格で結合を使用する必要があります

    SELECT t1.min_price, s1.ShippingCostId, s1.Weight, s2.CoD, s2.Artnr, s2.CoD, 
    s2.Regular, s2.ShippingProviderId, s3.ProviderName 
    FROM ShippingCost s1
    INNER JOIN ShippingProvider s2 ON s1.ShippingProviderId = s2.ShippingProviderId 
    INNER JOIN ShippingProviderTranslations s3 ON (s2.ShippingProviderId = s3.ShippingProviderId AND s3.Language = 'xx') 
    INNER JOIN (
      select MIN(s1.Price) as min_price, s2.ShippingProviderId
      from FROM ShippingCost s1 
      INNER JOIN ShippingProvider s2 ON s1.ShippingProviderId = s2.ShippingProviderId 
      group by s2.ShippingProviderId
    ) t1 on t1.ShippingProviderId = s2.ShippingProviderId and s1.Price= t1.min_price
    
    

    集計関数を使用した列でグループ化されないためのselectの使用は、予測できない結果を生成します
    この習慣はSQLでは推奨されず、mysqlの最新バージョンでは許可されず、エラーが発生します

あなたの答え