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

#php #mysql

Вопрос:

Я запускаю веб-галерею на основе тегов на PHP и MySQL. Я не эксперт в SQL, у меня есть базовое понимание, но не более того. Существует опция включения «категорий тегов», которая в основном позволяет использовать теги, такие как: животное:кошка, животное:собака

При редактировании тегов изображения есть возможность сортировать категории тегов в алфавитном порядке, используя этот запрос:

  SELECT tag, FLOOR(LN(LN(count - :tag_min1   1) 1)*150)/200 AS scaled, count
                                        FROM tags
                                        WHERE count >= :tag_min2
                                        ORDER BY CASE
                                            WHEN tag LIKE '%:%' THEN 1
                                            ELSE 2
                                        END, tag
                                        LIMIT :limit",
                        ["tag_min1" => $tags_min, "tag_min2" => $tags_min, "limit" => $max_count]
 

Что отлично работает, но я хотел бы добавить еще один уровень сортировки для размера категории тегов.

База данных выглядит следующим образом::

 Tag ID ---- Tag ---- Count
1 ---- animal:dog ---- 30
2 ---- animal:cat ---- 15
3 ---- object:car ---- 55
4 ---- object:train ---- 25
 

Я хочу, чтобы приведенный выше запрос сортировался (по убыванию) по количеству тегов (количеству), которые есть в категории, а не по самому тегу.
Это означает, что категория животных имеет 30 15 = 45 тегов, а категория объектов имеет 55 25 = 80 тегов, поэтому категория объектов должна быть первой.

Я работаю с MySQL версии 8.0.23

Спасибо!

ИЗМЕНИТЬ: Обмен образцами данных: Скриншот базы данных

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

1. Предоставьте точную версию MySQL. Я попытался поработать над этим с помощью функции string_split.В MySQL такой функции нет.

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

3. Спасибо вам за ваши комментарии! Я отредактировал вопрос и добавил скриншот, Кроме того, я, должно быть, что-то перепутал в части разделения строк, потому что я нашел руководство, которое сделало эту функцию. Моя вина

Ответ №1:

Тест

 SELECT ...
FROM ...
WHERE ...
ORDER BY SUM(`Count`) OVER (PARTITION BY SUBSTRING_INDEX(Tag, ':', 1)) DESC
 

ДЕМОНСТРАЦИЯ

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

1. Спасибо! ПОРЯДОК ПО СУММЕ(количеству) (РАЗДЕЛ ПО ПОДСТРОКЕ_ИНДЕКС(тег, ‘:’, 1)) Описание работало как заклинание. Большое вам спасибо!