首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在mysql中选择特定的行(或在选择中优先选择)?

如何在mysql中选择特定的行(或在选择中优先选择)?
EN

Stack Overflow用户
提问于 2010-06-20 15:14:03
回答 4查看 5.2K关注 0票数 3

需要你的帮助,伙计们形成一个查询。

举例说明。公司-汽车租赁

台车

代码语言:javascript
复制
ID  NAME       STATUS
1   Mercedes   Showroom
2   Mercedes   On-Road

现在,如何从满足以下条件的表中只选择一个条目?

如果

  1. 在展厅有梅赛德斯,那就只取那一行。(上面例子中的第1行)
  2. ,但是如果陈列室里没有梅赛德斯,那就取其中的一行。(即第1行或第2行)-(这只是说所有的奔驰都在路上)

使用distinct无助于这里,因为ID也是在select语句中获取的

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-20 16:45:57

MySQL没有排名/分析/窗口函数,但是您可以使用一个变量来模拟ROW_NUMBER功能(当您看到"--“时,它是一个注释):

代码语言:javascript
复制
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表,并使用外键关系来确保坏数据不会进入您的表中:

代码语言:javascript
复制
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;
票数 0
EN

Stack Overflow用户

发布于 2010-06-20 15:53:20

下面是解决这个问题的一种常见方法:

代码语言:javascript
复制
SELECT *,
CASE STATUS
WHEN 'Showroom' THEN 0
ELSE 1
END AS InShowRoom
FROM Cars
WHERE NAME = 'Mercedes'
ORDER BY InShowRoom
LIMIT 1

这里是如何得到所有的汽车,这也显示了另一个解决问题的方法:

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2010-06-20 15:59:47

您可能希望使用FIND_IN_SET()函数来完成这一任务。

代码语言:javascript
复制
SELECT *
FROM Cars
WHERE NAME = 'Mercedes'
ORDER BY FIND_IN_SET(`STATUS`,'Showroom') DESC
LIMIT 1

如果您有其他状态的首选顺序,只需将它们添加到第二个参数。

代码语言:javascript
复制
ORDER BY FIND_IN_SET(`STATUS`,'On-Road,Showroom' ) DESC

要获取所有汽车的“最佳”状态,只需这样做:

代码语言:javascript
复制
SELECT *
FROM Cars
GROUP BY NAME
ORDER BY FIND_IN_SET(`STATUS`,'Showroom') DESC
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3079717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档