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 は「ショールーム」がリストの一番上になることを意味するため、1 とランク付けされます。車名に「ショールーム」ステータスがない場合、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;