1

这是一个示例表:

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

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

4

3 回答 3

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
于 2012-02-24T02:44:00.373 回答
1

This does the job:

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

Well, almost. It doesn't return 7 or 8, 500, dorm room. But other than that it works.

于 2012-02-24T02:57:03.860 回答
1

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

   select * from temp_demo t1 where price=(select min(price) 
from temp_demo t2 where t1.name=t2.name)
于 2012-02-24T02:43:47.240 回答