2012-02-24 39 views
1

下面是一个例子表:MYSQL SELECT DISTINCT与结果的附加列设置

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 - 组列混合(MIN(),MAX(),COUNT(),...)没有GROUP列是非法的,如果没有GROUP BY子句

如果任何人都可以帮助我这个简单的表,我相信它也会对别人有所帮助。我已经看到很多复杂表格的例子,我无法理解它。

什么我希望的是整个行:

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

因为这些具有最低的价格为他们的独特名称

回答

1

这做工作:

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

好了,差不多了。它不返回7或8,500,宿舍。但除此之外,它的作品。

+0

好吧,因为我用64列查询11M行我真的需要避免嵌套任何东西,如果我可以帮助它,所以我会跟你的建议。实际上,每个房间的成千上万个房间的价格与'INT'的价格完全相同,因此我将它更改为'float'并随机向行添加0.1。我会把它放在输出上,所以我仍然得到重复的价格。我知道这是一个可怕的黑客,但速度是这里最重要的事情,我的客户端使用MYSQL4,所以我甚至无法分区。谢谢 :) – 2012-02-24 03:22:01

1

既然你还想要回房间号,则需要相关的子查询。请注意,这将为关系返回两条记录,而不是使用或连接数字。

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

为了让每个不同的名称以最低的价格,你不想DISTINCT,而是GROUP BY。内部GROUP BY查询返回的名称/价格对然后与JOIN中表的其余部分的id值匹配。

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