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的行将是任何状态出现在“陈列室”之后。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;