尝试这个:
#1st Query
SELECT *,LENGTH(fname)-LENGTH(replace(fname,' ','')) as word_count FROM mytable
ORDER BY word_count ASC;
#2nd Query
SELECT A.fname, LENGTH(A.fname)-LENGTH(replace(A.fname,' ','')) as word_count FROM mytable A LEFT JOIN
(SELECT *,LENGTH(fname)-LENGTH(replace(fname,' ','')) as w_count FROM mytable WHERE fname='Banana Cakes') B
ON A.fname=B.fname
ORDER BY CASE WHEN B.fname IS NOT NULL THEN B.w_count END DESC,
CASE WHEN B.fname IS NOT NULL THEN LENGTH(B.fname) END DESC,
word_count ASC;
在这里提琴:https : //www.db-fiddle.com/f/3gwZj9yMp43dhmzaETKghd/4
因此,第一个很简单,只需要按长度的升序和fname
降序排序(因为您的示例显示Banana Split
了返回的第一位,Banana Cakes
尽管长度和字数都差不多。按字母顺序,“ C”排在最前面,所以Banana Cakes
应该先返回)。
第二个查询我使“香蕉蛋糕”查询成为条件,然后LEFT JOIN
成为主表的子查询。在ORDER BY
我正在使用的CASE
表达式上,如果LEFT JOIN
(子查询的结果)的结果不为NULL,则ORDER首先使用该值,然后第二阶条件类似于第一查询中的第一阶条件。
编辑:为订单添加字数统计条件。请注意,此字数统计功能是在计算多少个空格而不是多少个字。示例:0
仅表示一个没有空格的单词,1
表示两个带有1个空格的单词。
我想要按字数而不是字符的结果ASC。如果我再添加一个名为“ Banana a b”的水果,则它排在第二个位置,而它排在最后或倒数第二个
哦,是的。我明白了。好吧,我想我知道该怎么办。让我先更新。
子查询?我怀疑我不会招待这个。
抱歉,我不确定我是否理解您的意思@mickmackusa。这是可以接受的方法吗?
您是否可以构造一种不会两次查询同一张表的方法?