Страшно.
Код не совсем понятен, как хорошо объясняют другие ответы, но выбор структуры для данных тега также может вызвать проблемы.
Вместо 5 столбцов для5 тегов, создайте отдельную таблицу тегов и свяжите ее со своими статьями:
article | tag |
1 | paint |
1 | picture |
1 | sculpture |
1 | photo |
1 | bronze |
2 | tourism |
2 | travel |
2 | tour |
Затем, когда вы тегируете, вам не нужно беспокоиться о том, является ли тег тегом tag1 или tag2, или тег tag3 равен NULLили вы передумали и хотите 6 тегов в конце концов.Структура будет работать в любом месте от 0 до любого количества тегов, делая бит «частей» в запросе примерно таким:
$parts = " tag in ('"
.implode($uniqueWords,"', '")
."')";
// e.g. if uniqueWords = ['one','two','three'], $parts= "tag in ('one','two','three','')"
Для этого взрыва, возможно, потребуется настройка, чтобы получить все кавычки и скобки вправильные места.
Ничто из этого не отвечает вашей реальной проблеме.Мне не ясно, пытаетесь ли вы найти первые 5 ключевых слов для вашей статьи, или любые 5 тегов, или лучшие 5 тегов.Я хотел бы предложить что-то вроде этого.
Разнесите вашу статью и при поиске уникальных слов подсчитайте вхождения в слова, за исключением распространенных английских слов, таких как "the".Затем отсортируйте уникальные слова в порядке появления, в первую очередь наиболее повторяющиеся слова.У вас есть список основных слов в вашей статье, возьмите первые пять, это теги.Вставьте в таблицу.
В качестве альтернативы, вот решение, которое может показаться грязным, но может быть более эффективным в конце.Напишите процедуру базы данных, чтобы выполнить этот процесс полностью в MySQL.Вам нужны две таблицы:
tagstable - 1 column "tag" is the PK
| paint |
| picture | articlewordstable - 1 column "word" is the PK - empty
| sculpture | | - |
| photo | | - |
| bronze |
Вставьте токенизированные слова в articlewordstable.Затем сделайте запрос к таблице, объединяющейся с тегами:
SELECT word FROM articlewordstable
INNER JOIN tagstable
ON tag = word;
, вы получите список слов, которые также являются тегами.Вы можете установить ограничение в 5 результатов, вы также можете сделать
SELECT word, count(word) occurrences FROM articlewordstable
INNER JOIN tagstable
ON tag = word
GROUP BY word
ORDER BY occurrences DESC;
, что даст вам наиболее часто используемые слова, которые также появляются в вашем списке тегов.Это также может быть ограничено до 5, а затем использовать по своему усмотрению.
Надеюсь, это поможет!