【问题标题】:MySQL ORDER BY CASE but keep duplicatesMySQL ORDER BY CASE 但保留重复项
【发布时间】:2014-11-27 19:00:43
【问题描述】:

我有一个格式为

的数据库
| Field      | Type             | Null | Key | Default | Extra          |
| word       | varchar(60)      | NO   |     | NULL    |                |
| english_id | int(10) unsigned | NO   | PRI | NULL    | auto_increment |


| word | english_id |
| the  |          1 |
| of   |          2 |
| and  |          3 |
| a    |          4 |
| to   |          5 |
| in   |          6 |
| ant  |          7 |
| be   |          8 |
| that |          9 |
| was  |         10 |

我希望能够按输入的顺序进行排序,但也可以保留重复项。因此,如果他们输入"a cat and a dog",我会通过下面的 SQL 查询得到正确的顺序。问题是,由于我使用a 两次,第二个a 没有出现。如何在输出中按顺序保留重复值?这是当前查询。

select english_id, word from english where word in ("Here", "are", "are", "dogs")
order by CASE word
  WHEN "here" then 1
  WHEN "are" then 2
  WHEN "are" then 3
  WHEN "dogs" then 4
END;

这是它的输出

| english_id | word |
|        131 | here |
|         26 | are  |
|       1679 | dogs |

我希望它看起来像这样

| english_id | word |
|        131 | here |
|         26 | are  |
|         26 | are  |
|       1679 | dogs |

【问题讨论】:

    标签: mysql sql case sql-order-by


    【解决方案1】:

    要让are 出现两次,您需要加入are 出现两次的“表”。你可以得到这样的表:

    SELECT 'Here'
    UNION ALL SELECT 'are'
    UNION ALL SELECT 'are'
    UNION ALL SELECT 'dogs'
    

    只需将您的 english 表加入到查询中,它应该可以正常工作:

    SELECT english_id, english.word
    FROM english
    JOIN (
        SELECT 'Here' AS word
        UNION ALL SELECT 'are'
        UNION ALL SELECT 'are'
        UNION ALL SELECT 'dogs') WordsToSearch ON english.word = WordsToSearch.word
    ORDER BY CASE word
      WHEN "here" then 1
      WHEN "are" then 2
      WHEN "are" then 3
      WHEN "dogs" then 4
      END;
    

    您还可以在单​​词列表中指定顺序信息以简化查询:

    SELECT english_id, english.word
    FROM english
    JOIN (
        SELECT 'Here' AS word, 1 AS word_order
        UNION ALL SELECT 'are', 2
        UNION ALL SELECT 'are', 3
        UNION ALL SELECT 'dogs', 4) WordsToSearch ON english.word = WordsToSearch.word
    ORDER BY WordsToSearch.word_order;
    

    附录

    OP 在最初发布的查询中遇到了问题,因为查询第一行中的列word 没有别名,并且非常友好地将更新后的查询发布在 cmets 中。上述查询已针对此修复进行了更新。

    【讨论】:

    • 感谢您的帮助。我对 WordsToSearch 是什么感到困惑?我的数据库名为语言。
    • WordsToSearchSELECT ... UNION SELECT ... UNION SELECT 查询的别名。我编的名字。您可以在此处使用任何您想要的名称。
    • 非常感谢您的帮助。我刚刚做了这个小改动,它起作用了 SELECT english_id, english.word FROM english JOIN ( SELECT 'Here' AS word, 1 AS word_order UNION ALL SELECT 'are', 2 UNION ALL SELECT 'are', 3 UNION ALL SELECT 'dogs ', 4) WordsToSearch ON english.word = WordsToSearch.word ORDER BY WordsToSearch.word_order;
    • 伟大的收获@tomato_paste - 谢谢!我已将我的答案中的查询修复为别名 word 列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    相关资源
    最近更新 更多