#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)) Описание работало как заклинание. Большое вам спасибо!