MYSQL SELECT DISTINCT с дополнительным столбцом в наборе результатов - PullRequest
1 голос
/ 24 февраля 2012

Вот пример таблицы:

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 (MIN (), MAX (), COUNT () ,...) без столбцов GROUP недопустимо, если нет предложения GROUP BY

Если кто-то может помочь мне с этой простой таблицей, я уверен, что это поможет и другим.Я видел много примеров со сложными таблицами, и я просто не могу разобраться с этим.

Я надеюсь на целые строки:

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

, потому что они имеютсамая низкая цена за их отличное имя

Ответы [ 3 ]

3 голосов
/ 24 февраля 2012

Чтобы получить самую низкую цену за отдельное имя, вам не нужно 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 голос
/ 24 февраля 2012

Это делает работу:

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

Ну, почти.Не возвращается 7 или 8, 500, комната в общежитии .Но кроме этого это работает.

1 голос
/ 24 февраля 2012

Поскольку вы также хотите вернуть номер комнаты, вам понадобится коррелированный подзапрос.Обратите внимание, что это вернет две записи для связей, а не объединит числа с помощью или.

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