【问题标题】:MYSQL Group by with the minimum valueMYSQL Group by 最小值
【发布时间】:2013-06-02 16:07:56
【问题描述】:

您好,我一直在寻找这个,我找到了其他示例代码的解决方案,但我不知道如何为我的代码实现。

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 分组的原因。目标是以最低的价格获得独特的游戏DBGames。

我有什么。

+--------------+---------+----+---------+
| 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(标记) Mark 提出的解决方案给了我这个错误。

  • 有游戏DBGames 重复。
  • 有些游戏没有显示。

我已经更新了 WHERE 子句以防万一。

【问题讨论】:

  • 你能给我们看看表结构吗?列:gameDBGamesgame_idgamePrice 属于什么表?
  • 您到底要选择什么?所有游戏,每个游戏的最低价格?所有游戏中价格最低的单机游戏?所有 gameDBGames(这代表什么?)价值最低的游戏?还有什么?
  • 在发布此类问题之前,请考虑显示表结构。 :)
  • 抱歉,我已经更新了描述。
  • 它更清晰了,但仍然不清楚gameDBGamesgame_idgame_idgamePrice 列在哪个表上 - 这将是必要的,作为相关子-query 将需要确定对于给定的gameDBGames,哪个game_id 具有最低的gamePrice

标签: mysql sql select group-by


【解决方案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 不是必需的 - 但是,对于给定的gameDBGames,将返回多个game_id if对于给定的gameDBGames,具有相同最低价格的多个game_id

【讨论】:

  • 谢谢,但它不能正常工作,有些结果没有显示,有些gameDBGames重复(可能是因为在某些情况下有些价格是一样的?)。我也用 where 子句更新了主帖
  • @xtyp:正如我在回答中所说,如果给定的 gameDBGames 有多个具有相同最低价格的 game_id,则将为给定的 gameDBGames 返回多个 game_id我>。您说可能是因为在某些情况下某些价格相同” - 价格是否相同? 如果有多个game_ids 具有相同的最低价格,您不想看到所有这些吗?如果没有,你想如何决定显示哪些?对于缺少的游戏,它们的所有gamePrice 值都为空吗?您能否在您的问题中添加一些缺失值的示例?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 2018-10-22
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
相关资源
最近更新 更多