代码之家  ›  专栏  ›  技术社区  ›  nyvokub

基于列值优先级的MySQL选择

  •  1
  • nyvokub  · 技术社区  · 8 年前

    假设您有一个由以下条目组成的表的动态视图

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

    id 用一个 type 属于 "cat" 可能看起来像

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

    类型 .

    例如,如果 类型 是 cat > dog > bunny

    如果我们称之为我们的观点 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 
    

    但似乎没办法让它起作用。非常感谢你的帮助。

    2 回复  |  直到 8 年前
        1
  •  3
  •   Gordon Linoff    8 年前

    在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 .

        2
  •  2
  •   D-Shih    8 年前

    CASE WHEN 将订单号输入 ORDER 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');
    

    :

    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 |