GROUP_CONCAT и DISTINCT - это здорово, но как мне избавиться от этих дубликатов, которые у меня все еще есть?
-
21-09-2019 - |
Вопрос
у меня есть таблица mysql, настроенная следующим образом:
id uid keywords -- --- --- 1 20 corporate 2 20 corporate,business,strategy 3 20 corporate,bowser 4 20 flowers 5 20 battleship,corporate,dungeon
я хочу, чтобы мой результат выглядел следующим образом:
20 corporate,business,strategy,bowser,flowers,battleship,dungeon
но самое близкое, что я получил, это:
SELECT DISTINCT uid, GROUP_CONCAT(DISTINCT keywords ORDER BY keywords DESC) AS keywords FROM mytable WHERE uid !=0 GROUP BY uid
какие результаты:
20 corporate,corporate,business,strategy,corporate,bowser,flowers,battleship,corporate,dungeon
у кого-нибудь есть решение?заранее огромное спасибо!
Решение
То, что вы делаете, невозможно с чистым SQL в том виде, в каком вы структурировали свои данные.
Ни одна реализация SQL не будет рассматривать "Corporate" и "Корпоративный, бизнес" и рассматривать их как равные строки.Следовательно, distinct не будет работать.
Если вы можете управлять базой данных,
Первое, что я бы сделал, это изменил настройку данных на:
id uid keyword <- note, not keyword**s** - **ONE** value in this column, not a comma delimited list
1 20 corporate
2 20 corporate
2 20 business
2 20 strategy
Еще лучше было бы
id uid keywordId
1 20 1
2 20 1
2 20 2
2 20 3
с отдельной таблицей для ключевых слов
KeywordID KeywordText
1 Corporate
2 Business
В противном случае вам нужно будет преобразовать данные в коде.
Другие советы
Ммм, ваши ключевые слова должны быть в отдельной таблице (по одной записи на ключевое слово).Тогда вы сможете это сделать, потому что тогда ключевые слова будут правильно СГРУППИРОВАНЫ.
Не уверен, есть ли это в MySQL, но в SQL Server есть RANK() НАД РАЗДЕЛЕНИЕМ, с помощью которого вы можете присвоить каждому результату ранг ... это позволит вам выбрать только те, которые имеют ранг 1, и отбросить остальные.
На мой взгляд, у вас есть два варианта.
Вариант 1:
Измените способ хранения ваших данных (ключевые слова в их собственной таблице, соедините существующую таблицу с таблицей ключевых слов, используя отношение "многие ко многим").Это позволит вам использовать DISTINCT.DISTINCT в настоящее время не работает, потому что запрос рассматривает "корпоративный" и "корпоративный, бизнес, стратегия" как два разных значения.
Вариант 2:
Напишите какой-нибудь "интересный" sql, чтобы разделить строки ключевых слов.Я не знаю, какие ограничения существуют в MySQL, но SQL в целом не предназначен для этого.