2013-11-11 3 views
0

В столбце (ключевое слово) таблицы (market_items) есть ключевые слова, разделяющие каждое ключевое слово запятой. Я использую этот запрос для извлечения ключевых слов;Аналогичные ключевые слова в группе

$cid = intval($cid); 
$query = $db->query(" 
    SELECT keywords 
    FROM ".TABLE_PREFIX."market_items 
    WHERE cid = '{$cid}' 
    GROUP BY keywords 
    ORDER BY dateline DESC 
"); 
$cat_tags = ''; 
while ($t = $db->fetch_array($query)) 
{ 
    $keywords = trim($t['keywords']); 
    $keys = explode(",",$keywords); 
    foreach ($keys AS $key) 
    { 
     $cat_tags .= '<span class="small_buttons_class"><a href="market.php?action=tag_items&keywords='.$key.'">'.$key.'</a></span> '; 
    } 
} 

Он извлекает ключевые слова в порядке, но его показ подобные ключевые слова, как это:

keyword1keyword2keyword1keyword3keyword4keyword5keyword3

"Обратите внимание на количество ключевых слов выше"

Как я могу удалить аналогичный ключевые слова и показать это так? например

keyword1keyword2keyword3keyword4keyword5

Просто, чтобы понять, в колонке "ключевые слова" ключевые слова хранятся так:

keyword2, keyword4, keyword3, keyword1

Пожалуйста, помогите!

+1

Пожалуйста, нормализуйте данные. –

+0

Что вы подразумеваете под нормализацией данных? – user2854563

+1

Если у вас есть несколько вещей, назначенных элементу, храните их в отдельных таблицах и перекрестно ссылайте их. По теме попробуйте '$ uniqueKeys = array_unique ($ keys);' Также если ваши данные хранятся точно так же, взорвайтесь на '', '', а не '', ''. –

ответ

1

Попробуйте это;

$cid = intval($cid); 
$query = $db->query(" 
    SELECT keywords 
    FROM ".TABLE_PREFIX."market_items 
    WHERE cid = '{$cid}' 
    ORDER BY dateline DESC 
"); 
$cat_tags = ''; 
while ($t = $db->fetch_array($query)) 
{ 
    $keywords = trim($t['keywords']); 
    $keys = explode(",",$keywords); 
    $keys = array_unique($keys); 
    foreach ($keys AS $key) 
    { 
     $key = trim($key); 
     $key_collect[$key] = $key; 
    } 
} 

foreach ($key_collect as $k) 
{ 
    $cat_tags .= '<span class="small_buttons_class"><a href="market.php?action=tag_items&keywords='.$k.'">'.$k.'</a></span> '; 
} 
0

SELECT DISTINCT ... {и остальной часть вашего запроса}

и мне кажется, что вам не нужно "группа по"

1
while ($t = $db->fetch_array($query)) 
{ 
    $keywords = trim($t['keywords']); 
    $keys = explode(",",$keywords); 
    foreach ($keys AS $key) 
    { 
     $tags[$key] = $key;   
    } 
} 
foreach ($tags as $tag) { 
    $cat_tags .= '<span class="small_buttons_class"><a href="market.php?action=tag_items&keywords='.$tag.'">'.$tag.'</a></span> '; 
} 
0

См Porter's algorithm. Я сделал реализацию несколько лет назад для испанского языка, работающего в поисковой системе. Английская реализация проще. Вы можете начать с моего кода PHP Stemmer. Это удаляет грамматические суффиксы из слов, основанных на правилах грамматики.

3

Вы столкнулись с одной из известных трудностей хранения списков в строках, разделенных запятыми: обеспечение уникальности списка или порядка сортировки в списке.

См. Мой ответ на вопрос Is storing a delimited list in a database column really that bad? для более сложных подводных камней этого подхода.

Чтобы решить эту проблему в SQL, вы должны сохранить список ключевых слов не как строку, а сохранить по одному ключевому слову на строку во второй таблице.

CREATE TABLE market_items_keywords (
    cid INT, 
    keyword VARCHAR(20), 
    PRIMARY KEY (cid, keyword) 
); 

Первичный ключ в этой таблице определяется так, что вы можете иметь несколько ключевых слов в каждой УУР, но для данного ИДС, каждое ключевое слово появляется только один раз, и в алфавитном порядке.

Вы получаете много других преимуществ от хранения ключевых слов таким образом.

  • Вы можете проиндексировать столбец keyword, чтобы узнать, какое из cid имеет заданное ключевое слово более эффективно, чем использование LIKE или регулярных выражений.
  • Вы можете делать отчеты, какие ключевые слова наиболее популярны.
  • Вы можете легко получить список различных ключевых слов, используемых во всем проекте.
  • и т.д.

Re ваш комментарий:

Вы можете использовать один запрос, чтобы получить ваши ключевые слова, но с уверенностью список является уникальным и предварительно сортируется:

$query = $db->query(" 
    SELECT keyword 
    FROM ".TABLE_PREFIX."market_items_keywords 
    WHERE cid = '{$cid}' 
"); 

Если вам нужно их сортировка по дате:

$query = $db->query(" 
    SELECT k.keyword 
    FROM ".TABLE_PREFIX."market_items_keywords AS k 
    JOIN ".TABLE_PREFIX."market_items AS i USING (cid) 
    WHERE k.cid = '{$cid}' 
    ORDER BY i.dateline DESC 
"); 

Выполнение этого действия означает, что вам не нужно взорвать() список ключевых слов и не использовать цикл foreach внутри цикла while. Просто введите строки.

+0

Спасибо за ваш отзыв Karwin, но так как я не хочу использовать дополнительный запрос для выбора списка ключевых слов, поэтому я использую это. Ваш ответ действительно помог мне, спасибо! – user2854563

Смежные вопросы