需要你的帮助,伙计们形成一个查询。
举例说明。公司-汽车租赁
台车
ID NAME STATUS
1 Mercedes Showroom
2 Mercedes On-Road现在,如何从满足以下条件的表中只选择一个条目?
如果
使用distinct无助于这里,因为ID也是在select语句中获取的
谢谢!
发布于 2010-06-20 16:45:57
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”添加记录。它们是有效的,但是当您对用于计数、求和等的事物进行分组时,您正在考虑使用低和高等函数。函数的使用也会使列上的索引变得无用.您需要考虑创建一个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;发布于 2010-06-20 15:53:20
下面是解决这个问题的一种常见方法:
SELECT *,
CASE STATUS
WHEN 'Showroom' THEN 0
ELSE 1
END AS InShowRoom
FROM Cars
WHERE NAME = 'Mercedes'
ORDER BY InShowRoom
LIMIT 1这里是如何得到所有的汽车,这也显示了另一个解决问题的方法:
SELECT ID, NAME, IFNULL(c2.STATUS, c1.STATUS)
FROM Cars c1
LEFT OUTER JOIN Cars c2
ON c2.NAME = c1.NAME AND c2.STATUS = 'Showroom'
GROUP BY NAME
ORDER BY NAME发布于 2010-06-20 15:59:47
您可能希望使用FIND_IN_SET()函数来完成这一任务。
SELECT *
FROM Cars
WHERE NAME = 'Mercedes'
ORDER BY FIND_IN_SET(`STATUS`,'Showroom') DESC
LIMIT 1如果您有其他状态的首选顺序,只需将它们添加到第二个参数。
ORDER BY FIND_IN_SET(`STATUS`,'On-Road,Showroom' ) DESC要获取所有汽车的“最佳”状态,只需这样做:
SELECT *
FROM Cars
GROUP BY NAME
ORDER BY FIND_IN_SET(`STATUS`,'Showroom') DESChttps://stackoverflow.com/questions/3079717
复制相似问题