我有一个格式为的数据库
| 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/