2013-06-02 26 views
-2

嗨,我一直在尋找這個,我已經找到了其他示例代碼的解決方案,但我無法弄清楚如何執行我的。MYSQL組與最小值

SELECT `gameDBGames`, `game_id`, MIN(`gamePrice`) AS `gamePrice` 
FROM `games` 
LEFT JOIN `platforms` ON `gamePlatform` = `platform_id` 
LEFT JOIN `bundles` ON `gameBundle` = `bundle_id` 
LEFT JOIN `currency` ON `bundleCurrency` = `currency_id` 
WHERE `bundleEnd` > CURDATE() AND `bundleType` = "1" AND `gameDBGames` != "0" 
GROUP BY `gameDBGames` 

這是我的實際查詢。這將返回最低價格,但不對應於game_id。我怎麼能這樣做?我相信是這樣做的內部連接:

SELECT `gameDBGames`, `game_id`, MIN(`gamePrice`) AS `gamePrice` 
FROM `games` 
LEFT JOIN `platforms` ON `gamePlatform` = `platform_id` 
LEFT JOIN `bundles` ON `gameBundle` = `bundle_id` 
INNER JOIN (....) 
LEFT JOIN `currency` ON `bundleCurrency` = `currency_id` 
WHERE b.`bundleEnd` > CURRDATE() AND b.`bundleType` = "1" AND g.`gameDBGames` != "0" 

謝謝。

編輯:對不起,我不知道我在想什麼,不張貼表結構。

game_id是唯一的ID(例如,相同的遊戲,但具有不同的價格),並且gameDBGames是遊戲的ID(例如,gameDBGames = 1,可以具有價格40或30),這就是爲什麼我是由gameDBGames分組的原因。目標是以最低價格獲得獨特的遊戲DB遊戲。

我有。

+--------------+---------+----+---------+ 
| table games |   | |   | 
+--------------+---------+----+---------+ 
| game_id  | int  | AI | PRIMARY | 
| gameDBGames | int  | |   | 
| gamePrice | float | |   | 
| gamePlatform | tinyint | |   | 
| gameBundle | int  | |   | 
+--------------+---------+----+---------+ 

+---------+-------------+-----------+--------------+------------+ 
| game_id | gameDBGames | gamePrice | gamePlatform | gameBundle | 
+---------+-------------+-----------+--------------+------------+ 
|  1 |   1 |  20 |   1 |   1 | 
|  2 |   2 |  20 |   2 |   1 | 
|  3 |   2 |  15 |   2 |   1 | 
|  4 |   3 |  17 |   1 |   1 | 
|  5 |   3 |  20 |   1 |   1 | 
|  6 |   3 |  15 |   1 |   1 | 
|  7 |   4 |  16 |   2 |   2 | 
|  8 |   5 |  18 |   2 |   2 | 
|  9 |   5 |  14 |   2 |   2 | 
|  10 |   6 |  15 |   1 |   2 | 
+---------+-------------+-----------+--------------+------------+ 

我得到了什麼。

+---------+-------------+-----------+--------------+------------+ 
| game_id | gameDBGames | gamePrice | gamePlatform | gameBundle | 
+---------+-------------+-----------+--------------+------------+ 
|  1 |   1 |  20 |   1 |   1 | 
|  2 |   2 |  15 |   2 |   1 | 
|  4 |   3 |  15 |   1 |   1 | 
|  7 |   4 |  16 |   2 |   2 | 
|  8 |   5 |  14 |   2 |   2 | 
|  10 |   6 |  15 |   1 |   2 | 
+---------+-------------+-----------+--------------+------------+ 

正如你所看到的,game_id不對應於gamePrice。它應該是這樣的。

+---------+-------------+-----------+--------------+------------+ 
| game_id | gameDBGames | gamePrice | gamePlatform | gameBundle | 
+---------+-------------+-----------+--------------+------------+ 
|  1 |   1 |  20 |   1 |   1 | 
|  3 |   2 |  15 |   2 |   1 | 
|  6 |   3 |  15 |   1 |   1 | 
|  7 |   4 |  16 |   2 |   2 | 
|  9 |   5 |  14 |   2 |   2 | 
|  10 |   6 |  15 |   1 |   2 | 
+---------+-------------+-----------+--------------+------------+ 

希望你現在明白,對不起之前沒有更多解釋。如果你需要別的東西,請問。謝謝。

編輯2(馬克) 馬克解決方案給我這個錯誤。

  • 還有gameDBGames重複。
  • 有些遊戲未顯示。

我更新了WHERE子句以防萬一需要。

+0

你能告訴我們表結構嗎?什麼表列:'gameDBGames','game_id','gamePrice'屬於? –

+0

你究竟想要選擇什麼?所有遊戲,每個遊戲的價格最低?哪款遊戲的價格最低?所有gameDBGames(這代表什麼?)價值與每個最低價格的遊戲?還有別的嗎? –

+0

在發佈此類問題之前,請考慮顯示錶格結構。 :) –

回答

1

嘗試:

SELECT g.`gameDBGames`, g.`game_id`, g.`gamePrice` 
FROM (SELECT `gameDBGames`, MIN(`gamePrice`) AS `minPrice` 
     FROM `games` 
     GROUP BY `gameDBGames`) mn 
JOIN `games` g 
    ON mn.`gameDBGames`=g.`gameDBGames` and mn.`minPrice`=g.`gamePrice` 
LEFT JOIN `platforms` p ON g.`gamePlatform` = p.`platform_id` 
LEFT JOIN `bundles` b ON g.`gameBundle` = b.`bundle_id` 
LEFT JOIN `currency` c ON b.`bundleCurrency` = c.`currency_id` 
WHERE .... 

在主查詢的GROUP BY不應要求,由於子查詢分組 - 然而,不止一個game_id將針對給定gameDBGames如果有返回對於給定的gameDBGames,具有相同的最低價格的多於一個game_id

+0

謝謝,但它不工作的權利一些結果不顯示,一些gameDBGames重複(可能是因爲在某些情況下,一些價格是相同的?)。我已經用where子句更新了主帖 – xtyp

+0

@xtyp:正如我在我的回答中所述,*如果給定的gameDBGames會有多於一個game_id將返回,如果有多個game_id具有給定的最低價格gameDBGames *。你說*「**也許**,因爲在某些情況下某些價格是相同的」* - 價格是否相同,或者不是? **如果**有多個'game_id'具有相同的最低價格,難道你不想看到所有這些嗎?如果不是,你想如何決定哪些顯示?在缺少遊戲的情況下,他們所有的'gamePrice'值都是空的嗎?你能否給你的問題添加一些缺失值的例子? –