2013-10-23 70 views
1

我今天做了一個測試,有兩個問題我找不出來。我忘了第二個,但這是第一個:MySQL查詢我難住了

你有一個關於啤酒的數據庫。三個表格,只有2個與問題相關。它們是:

Variaties:

  • variety_id
  • variety_name

啤酒:

  • beer_id
  • beer_name
  • 品種_id
  • beer_alcohol

beer_alcohol是雙,代表醇百分比。

有38個品種的啤酒和1215個人啤酒項目。

現在的問題是:顯示所有啤酒品種,每種品種的最高酒精百分比以及具有這個百分比的啤酒名稱。

乍一看,這是酒品中的「內部連接」,酒精中的「max()」和品種_id /變量名稱中的「分組」。

問題是,這不會顯示啤酒的品種中酒含量最高的名稱。它將顯示其品種的第一個按字母順序排列的啤酒。

然後我開始琢磨着,但是我無法開始想象如何在沒有功能的情況下做到這一點。 有人可以啓發我嗎?

+1

啤酒數據庫?我是唯一一個在無聊的財務方面工作的人嗎? :) –

+0

我覺得你快到了。您還需要按啤酒名稱進行分組 –

+0

再次使用beer_alcohol和variety_id加入啤酒表,我應該考慮一下。 – mustaccio

回答

0

做多一個連接在多樣性和百分比上的連接。在外面這樣做會得到正確的信息。

這將帶來2個結果回來,如果有啤酒具有相同百分比

0

你也子選擇,例如

select variety_id, variety_name, beer_name, abv 
FROM varieties 
JOIN (
    select beer_id, beer_name, variety_id, MAX(beer_alcohol) as abv 
    FROM beers 
    GROUP BY variety_id 
) booziest ON booziest.variety_id = varieties.variety_id 
+1

,對於我總是給第一個記錄的beer_id,beer_name,但是正確的慾望記錄的variety_id和abv。爲了解決這個問題,您必須將beer_name和beer_id包含在...中 –

+0

是的,謝謝 - 在這種情況下,MySQL中的分組行爲有點模糊,我沒有指定就懶惰了。要分組權利,你應該指定每一列不是聚合,在這種情況下,beer_id和beer_name – James

+0

對不起,但結果是一樣的。每個beer_name顯示的是它的第一個字母,按字母順序。 – KdgDev

0

我通常喜歡樣本數據和樣本輸出,但讓我們盲目回答這個問題。

這是一個最大的n-per-group問題(n = 1)。你可以用一個派生表來解決這個問題,或者,我個人最喜歡的左連接:

SELECT v.variety_id, v.variety_name, b1.* FROM beers b1 
LEFT JOIN beers b2 
    ON b1.variety_id = b2.variety_id AND b1.beer_alcohol < b2.beer_alcohol 
WHERE b2.beer_alcohol IS NULL 
JOIN varieties v ON b1.variety_id = v.variety_id 
+0

我在最後一行出現「SQL語法錯誤」。我將它與第二行切換到最後一行,結果爲168行。這可能與查詢不包括任何形式的分組有關。感謝您盡力幫助。 – KdgDev