【问题标题】:MYSQL SELECT DISTINCT with additional column in result setMYSQL SELECT DISTINCT 与结果集中的附加列
【发布时间】:2012-02-24 02:38:47
【问题描述】:

这是一个示例表:

CREATE TABLE `deals_unsorted`.`temp_demo` (
`id` INT( 4 ) NOT NULL AUTO_INCREMENT ,
`price` INT( 5 ) NOT NULL ,
`name` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = MYISAM 

还有一些样本数据

INSERT INTO `deals_unsorted`.`temp_demo` (
`id` ,
`price` ,
`name`
)
VALUES (
'1', '1300', 'suite'
), (
'2', '1200', 'suite'
), (
'3', '1100', 'standard'
), (
'4', '1000', 'standard'
), (
'5', '800', 'basic'
), (
'6', '900', 'basic'
), (
'7', '500', 'dorn room'
), (
'8', '500', 'dorm room'
), (
'9', '800', 'twin'
), (
'10', '750', 'twin'
)

但是我到底如何才能找到价格最低的所有不同房间呢?

我尝试了SELECT DISTINCT(name), MIN(price) FROM temp_demo; 和许多变体,但计算机说不,谢谢:

1140 - 如果没有 GROUP BY 子句,混合没有 GROUP 列的 GROUP 列 (MIN(),MAX(),COUNT(),...) 是非法的

如果有人可以帮助我解决这个简单的表格,我相信它也会对其他人有所帮助。我见过很多复杂表格的例子,我就是想不通。

我希望的是整行:

2, 1200, suite
4, 1000, stanbard
5, 800, basic
7 or 8, 500, dorm room
10, 750, twin

因为它们的独特名称价格最低

【问题讨论】:

    标签: php mysql sql mysql-error-1140


    【解决方案1】:

    要获得每个不同名称的最低价格,您不需要DISTINCT,而是需要GROUP BY。然后,内部 GROUP BY 查询返回的名称/价格对与表其余部分中的 id 值与 JOIN 匹配。

    SELECT id, nmin.name, nmin.price
    FROM deals_unsorted JOIN (
      SELECT name, MIN(price) AS price FROM deals_unsorted GROUP BY name
    ) nmin ON deals_unsorted.name = nmin.name AND deals_unsorted.price = nmin.price
    

    【讨论】:

      【解决方案2】:

      这样就可以了:

      SELECT id, name, MIN(price)FROM deals_unsorted GROUP BY name
      

      嗯,差不多。它不返回 7 或 8、500、宿舍。但除此之外它还有效。

      【讨论】:

      • 好吧,当我查询 64 列的 11M 行时,如果我能提供帮助,我真的需要避免嵌套任何东西,所以我会接受你的建议。每个房间实际上有数千个,价格与INT 完全相同,所以我将其更改为float,并在行中随机添加 0.1。我会在输出时floor 它,所以我仍然会得到重复的价格。我知道这是一个可怕的 hack,但速度是这里最重要的事情,我的客户端在 MYSQL4 上,所以我什至无法对表进行分区。谢谢:)
      【解决方案3】:

      由于您还想返回房间号,因此您需要一个相关的子查询。请注意,这将返回两条平局记录,而不是用或连接数字。

         select * from temp_demo t1 where price=(select min(price) 
      from temp_demo t2 where t1.name=t2.name)
      

      【讨论】:

        猜你喜欢
        • 2014-07-10
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-02
        相关资源
        最近更新 更多