MySQL 按情况排序但保留重复项

标签 mysql sql case sql-order-by

我有一个格式为的数据库

| 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 dogs”,我会通过下面的 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 |

最佳答案

要让 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 没有别名,并且非常友善地在评论中发布了更新的查询。上述查询已针对此修复进行了更新。

关于MySQL 按情况排序但保留重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26166752/

相关文章:

MySQL 到 SQL Server 2005

mysql - 按 groupby 计数的 sql 查询问题

scala - 有没有办法查看 Scala 比赛期间通配符模式接收到的内容?

Java Camel 大小写撇号问题

php - mysql JOIN 查询多次返回相同的行

mysql - 组合这些 mySQL 查询

mysql - 如何根据唯一的子行查找父行?

javascript - 在另一个页面中反射(reflect)从数据库中存储的单选切换按钮选择

sql - SSIS : Using multicast to enter data into 2 RELATED destinations

c - 如果 switch 语句正在执行 C 中的所有其他情况,如何停止它?