#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