mysql — Как мне отсортировать в порядке убывания количества, список, который извлекает определенные значения из запроса?

#mysql

#mysql

Вопрос:

итак, я составил список, который мне нужно отсортировать на основе общего количества раз, когда выдается определенное значение. Итак, ниже приведена таблица,

 name  | remark
mary  | has a Samsung phone
peter |  has an Iphone
sam   | has an Iphone
bart  | has a Nokia phone
gary  | has a Samsung phone
may   | has an Iphone
  

Итак, я хочу отсортировать его на основе общего количества раз, когда упоминались марки телефонов.
Так, например; Я хочу получить результат,

 name  | remark
may   | has an Iphone
peter |  has an Iphone
sam   | has an Iphone
mary  | has a Samsung phone
gary  | has a Samsung phone
bart  | has a Nokia phone
  

Я попытался использовать функцию LIKE, чтобы посмотреть, смогу ли я извлечь марки телефонов, но у меня возникли проблемы с получением количества марок и перечислением их по порядку. Есть идеи, как мне это сделать?

Комментарии:

1. Ваши выборочные данные не передают суть, потому что в каждой строке ваших выборочных данных упоминается ровно один сотовый телефон.

2. У вас есть таблица с брендами?

3. Нет, я этого не делаю. Я надеялся использовать команду для извлечения брендов и сортировки их оттуда, если это возможно.

4. Нет критериев для определения того, какое слово в примечании является названием бренда.

Ответ №1:

У вас нет brands таблицы.. таким образом, строки сортируются по remark количеству копий значений всего столбца:

 SELECT *
FROM test t1
ORDER BY ( SELECT COUNT(*)
           FROM test t2
           WHERE t1.remark = t2.remark ) DESC
  

скрипка

Ответ №2:

Предполагая, что формат remark столбца согласован, мы можем сортировать по количеству вхождений каждого замечания, используя оконные функции:

 select t.*
from mytable t
order by count(*) over(partition by remark) desc, name
  

Примечания:

  • оконные функции доступны только в MySQL 8.0

  • Я добавил второй критерий сортировки, поэтому строки с одинаковым брендом затем сортируются по name

Комментарии:

1. Смогу ли я по-прежнему использовать раздел, если формат в столбце примечания был непоследовательным?

Ответ №3:

Вы можете использовать несколько запросов, см. Код ниже:

     Select dd.name,dd.remark,dd2.cnt from  
    (select  name, remark,0 as cnt from Test group by name,remark) as dd, 
   (select   remark,count(remark) as cnt from Test group by remark) as dd2 where 
    dd.remark=dd2.remark order by dd2.cnt desc ,dd.name
  

Пример кода