2009-10-15 2 views
2

я имею таблицу MySQL настроить следующим образом:GROUP_CONCAT и DISTINCT великолепны, но как я могу избавиться от этих дубликатов, которые у меня есть?

 
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 

У кого-нибудь есть решение? спасибо за тонну заранее!

+0

спасибо, ребята, я забыл упомянуть, чтобы избежать тонны дополнительного кода (включая поиск), я хотел бы попытаться сохранить структуру как есть, если это возможно. – taber

ответ

5

То, что вы делаете, невозможно с чистым SQL, так как у вас есть структурированные данные.

Реализация SQL не собирается рассматривать «Корпоративный» и «Корпоративный бизнес» и рассматривать их как равные строки. Поэтому разные не будут работать.

Если вы можете управлять базой данных,

Первое, что я хотел бы сделать, это изменить настройки данных быть:

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 

В противном случае вам нужно будет массировать данные в коде.

+0

+1 для обеспечения детали. –

0

Не уверен, что у MySql это, но у SQL Server есть RANK() НАД ОПРЕДЕЛЕНИЕМ, который вы можете использовать для присвоения каждому результату ранга ... это позволит вам выбрать только те из ранжирования 1 и отказаться отдых.

+0

Я тоже не уверен, но похоже, что это будет сиротой «цветов»? так как не гарантируется, что наибольшая строка будет иметь все возможные ключевые слова, которые появляются в других строках.я хотел бы иметь каждый результат в 1 строке, если бы мог - вот что мне нравится в group_concat. – taber

1

Ммм, ваши ключевые слова должны быть в их собственной таблице (по одной записи за ключевое слово). Тогда вы сможете это сделать, потому что ключевые слова будут тогда GROUP правильно.

+0

+1. По большому счету, что я пытался сказать, более кратким образом. – David

0

У вас есть два варианта, как я его вижу.

Вариант 1:

изменения способа хранения данных (ключевые слова в их собственной таблице, присоединиться к существующей таблицы с таблицей ключевых слов, используя многие-ко-многим). Это позволит вам использовать DISTINCT. DISTINCT не работает в настоящее время, потому что запрос видит «корпоративный» и «корпоративный, бизнес, стратегию» как два разных значения.

Вариант 2:

Написать некоторые 'интересные' SQL разделить строки ключевых слов. Я не знаю, какие ограничения существуют в MySQL, но SQL вообще не предназначен для этого.