3

在形成查询时需要您的帮助。

例子。公司 - 租车

表 - 汽车

ID  NAME       STATUS
1   Mercedes   Showroom
2   Mercedes   On-Road

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

  1. 如果梅赛德斯在陈列室中可用,则仅获取该行。(即上面示例中的第 1 行)

  2. 但是,如果陈列室中没有一辆梅赛德斯可用,则取其中任何一排。(即第1行或第2行)-(这只是说所有的梅赛德斯都在路上)

在这里使用 distinct 没有帮助,因为 ID 也在 select 语句中获取

谢谢!

4

4 回答 4

3

这是解决该问题的常用方法:

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-20T15:53:20.047 回答
3

你会想使用该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') DESC
于 2010-06-20T15:59:47.970 回答
1
SELECT * FROM cars 
  WHERE name = 'Mercedes' 
  AND status = 'Showroom' 
UNION SELECT * FROM cars 
  WHERE name = 'Mercedes' 
LIMIT 1;

编辑删除了 UNION 上的 ALL,因为无论如何我们只想要不同的行。

于 2010-06-20T15:18:16.297 回答
0

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;
于 2010-06-20T16:45:57.613 回答