MySQL не имеет функций ранжирования / аналитики / управления окнами, но вы можете использовать переменную для имитации функциональности ROW_NUMBER (когда вы видите "-", это комментарий):
SELECT x.id, x.name, x.status
FROM (SELECT t.id,
t.name,
t.status,
CASE
WHEN @car_name != t.name THEN @rownum := 1 -- reset on diff name
ELSE @rownum := @rownum + 1
END AS rank,
@car_name := t.name -- necessary to set @car_name for the comparison
FROM CARS t
JOIN (SELECT @rownum := NULL, @car_name := '') r
ORDER BY t.name, t.status DESC) x --ORDER BY is necessary for rank value
WHERE x.rank = 1
Упорядочение по статусу DESC означает, что «Showroom» будет в верхней части списка, поэтому он будет оценен как 1. Если у названия автомобиля нет статуса «Showroom», строка, оцененная как 1, будет быть какой бы ни был статус после "Showroom". Предложение WHERE вернет только первую строку для каждого автомобиля в таблице.
Статус, являющийся типом данных на основе текста, говорит мне, что ваши данные не нормализованы - я мог бы добавить записи с "Showroom", "SHOWroom" и "showROOM". Они были бы действительны, но вы смотрите на использование таких функций, как LOWER & UPPER, когда вы группируете вещи для подсчета, суммирования и т. Д. Использование функций также сделает индекс столбца бесполезным ... Вы захотите рассмотреть возможность создания таблицы CAR_STATUS_TYPE_CODE и использовать отношение внешнего ключа, чтобы убедиться, что неверные данные не попадают в вашу таблицу:
DROP TABLE IF EXISTS `example`.`car_status_type_code`;
CREATE TABLE `example`.`car_status_type_code` (
`car_status_type_code_id` int(10) unsigned NOT NULL auto_increment,
`description` varchar(45) NOT NULL default '',
PRIMARY KEY (`car_status_type_code_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;