MYSQL SELECT DISTINCT,结果集中包含其他列

时间:2012-02-24 02:38:48

标签: php mysql sql mysql-error-1140

这是一个示例表:

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列(MIN(),MAX(),COUNT(),...)没有GROUP列是非法的

如果有人可以帮我解决这个简单的表格,我相信它对别人也有帮助。我见过很多复杂表格的例子,我无法理解它。

我希望的是整行:

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

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

3 个答案:

答案 0 :(得分:3)

要获得每个不同名称的最低价格,您不需要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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

这就是工作:

SELECT id, name, MIN(price)FROM deals_unsorted GROUP BY name
好吧,差不多。它不会返回 7或8,500,宿舍。但除此之外它还有效。