2017-11-04 12 views
2

次のクエリをJOINを使用してテーブルから最小値を選択するには、productsテーブルからすべての製品ラインで最低価格の製品を選択:のMySQL -

SELECT 
    a.productline, a.productCode, a.productName, a.buyprice 
FROM 
    products a 
     LEFT JOIN 
    products b ON a.productline = b.productline 
     AND b.buyprice < a.buyprice 
WHERE 
    b.productcode IS NULL; 

あなたはコードhereを見つけることができます。コードをテストするオンラインエディタはhereです。

テーブルaproductLineのクエリがどのようにして最低値を見つけるのか分かりません。buyPriceです。あるproductLineaのある行については、表bの複数の行が存在する可能性があります。 1)だから最低のものはどのように選択されていますか? 2)テーブルabとしてNULLはどのようにしてb.productcodeになりますか?

+0

WHERE句を削除し、SELECT *を使用します。LEFT JOINの動作を確認します。 –

答えて

0

あなたがそのサイトでこのクエリを実行した場合:あなたは右端の列を見れば

| productline |    productName    | buyprice | buyprice |    productName    | 
|--------------|-------------------------------------|----------|----------|-------------------------------------| 
| Classic Cars | 1958 Chevy Corvette Limited Edition | 15.91 | (null) | (null)        | 
| Classic Cars | 1982 Lamborghini Diablo    | 16.24 | 15.91 | 1958 Chevy Corvette Limited Edition | 
| Classic Cars | 1966 Shelby Cobra 427 S/C   | 29.18 | 15.91 | 1958 Chevy Corvette Limited Edition | 
| Classic Cars | 1970 Plymouth Hemi Cuda    | 31.92 | 15.91 | 1958 Chevy Corvette Limited Edition | 
| Classic Cars | 1961 Chevrolet Impala    | 32.33 | 15.91 | 1958 Chevy Corvette Limited Edition | 

だから、あなたは「1958シボレーが表示されます。

SELECT 
    a.productline, a.productName, a.buyprice, b.buyprice, b.productName 
FROM products a 
LEFT JOIN products b ON a.productline = b.productline 
     AND b.buyprice < a.buyprice 
ORDER BY 
    a.productline, b.buyprice, a.buyprice, b.productName 
LIMIT 5 

あなたはこの結果を得ますコルベット限定版 "を何回も繰り返した。これは

  1. 製品テーブル自体と比較されているため
  2. 条件a.productline = b.productlineは「クラシックカー」と照合されている「クラシックカー」を意味加入(これは呼ばれて「自己への参加」)である(とそう)各PRODUCTLINE値のために)そうALL「クラシックカー」bからaEACH「クラシックカー」と比較され、あなたが道によって行の多くと多くを得ます。
  3. 次いで、a.buypricea.buyprice未満でなければならないb.buyriceと比較されます。しかし、最も安い車($ 15.91)には、その最も安い価格よりも低い一致する行があることができないので、LEFT JOINは一致していない行を結果に含め、bの列はその最も安い車の行に対してNULLです。
  4. は次にwhere clauseは(これらは最も安いa.buypriceを見つけることに関心のあるように)b.productcodeは任意の値を持つすべての行

したがってだけ安い(最も低い)価格が記載されている任意の列からの除去しますb IS NULL

| productline |    productName    | buyprice | buyprice |    productName    | 
|--------------|-------------------------------------|----------|----------|-------------------------------------| 
| Classic Cars | 1958 Chevy Corvette Limited Edition | 15.91 | (null) | (null)        | 
+0

「もっとも安い車($ 15.91)は、一致する行を持つことができません」 - この最も安い車がテーブル「a」のものであると言われれば、理解しやすくなります。 –

+0

'AND b.buyprice

+0

できます!単に現在の行よりも高い価格を要求する述語を逆にします。 (<の代わりに>を使用すると、同じロジックが適用されますが、最低価格ではなく最高価格が見つかる –