GROUP_CONCAT и DISTINCT - это здорово, но как мне избавиться от этих дубликатов, которые у меня все еще есть?

StackOverflow https://stackoverflow.com/questions/1570310

Вопрос

у меня есть таблица 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 в целом не предназначен для этого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top