繁体   English   中英

MySQL根据一列值的优先级进行选择

[英]MySQL select based on precedence of a column's values

假设您有一个包含以下条目的表的动态视图

| id | type |
| 1  | cat  |
| 2  | dog  |
| 3  | bunny|

要注意的是,有时可能不存在带有"cat" typeid ,它可能看起来像

| id | type |
| 1  | dog  |
| 2  | bunny|

人们将如何为该表编写查询以根据type优先级选择单个行。

例如,如果type的排名为cat > dog > bunny ,那么我希望该表中的第一个条目具有最高的排名条件。

如果我们将我们的view pets称为ORDER BY id ASC那么我们将得到一个查询,看起来像这样

SELECT *
FROM pets
WHERE type = 'cat' > 'dog' > 'bunny' -- here is where I need help
LIMIT 1

我已经尝试过类似的事情

IF EXISTS (SELECT * 
       FROM   pets 
       WHERE  type = "cat") 

THEN SELECT * FROM pets WHERE condition = "cat" LIMIT 1
-- etc... down the ranking 

似乎无法使它正常工作。 非常感谢您的帮助。

在MySQL中,我将使用field()

SELECT *
FROM pets
WHERE type IN ('cat', 'dog', 'bunny')
ORDER BY field(type, 'cat', 'dog', 'bunny')
LIMIT 1

如果您不想处理WHERE子句,则可以执行以下操作:

SELECT *
FROM pets
ORDER BY field(type, 'bunny', 'dog', 'cat') DESC
LIMIT 1

您需要倒退,因为不匹配返回为0

当您在ORDER BY创建订单号时,可以尝试使用CASE WHEN order by然后在LIMIT 1完成客户order by

CREATE TABLE pets(
  ID INT,
  type VARCHAR(50)
);


INSERT INTO pets VALUES ( 1  , 'cat');
INSERT INTO pets VALUES ( 2  , 'dog');
INSERT INTO pets VALUES ( 3  , 'bunny');
INSERT INTO pets VALUES ( 4 , 'TST');

查询1

SELECT *
FROM pets
ORDER BY CASE 
    WHEN type = 'cat' THEN 1  
    WHEN type = 'dog' THEN 2 
    WHEN type = 'bunny' THEN 3 
    ELSE 4  
    END 
LIMIT 1

结果

| ID | type |
|----|------|
|  1 |  cat |

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM