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

时间:2018-08-22 20:58:19

标签: mysql sql

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

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

遇到的问题是,有时id的{​​{1}}可能不像type

"cat"

人们将如何为该表编写查询以根据| id | type | | 1 | dog | | 2 | bunny| 的优先级选择单个行。

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

如果我们调用具有cat > dog > bunny的视图pets,那么我们将有一个看起来像这样的查询

ORDER BY id ASC

我尝试过类似的事情

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

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

2 个答案:

答案 0 :(得分:3)

在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

答案 1 :(得分:2)

您可以尝试使用CASE WHENORDER BY中创建订单号,先让客户order by然后LIMIT 1

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

Results

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