Добрый день, дорогие профессионалы. Подскажите пожалуйста, как сделать вот такой запрос:
У нас есть поле ввода. В него человек через запятую пишет ключевые слова: Море, пальма, девушки, C++, яма, google. Количество слов произвольное. Порядок тоже.
Имеем в mysql таблицу. В которой среди прочих полей есть поле "ключевые слова".
Приведем несколько строк в пример: id1: Пальма, яма, Алексей, котики, погода.
id2: С++, яма, море.
id3: Пальма, масло, девушки, яндекс, другое, яд.
id4: Котики, google, яма, С++, девушки, море, пальма.
id5: Кит, лужа, жаба, картина, дрон.
id6: Кролик, бегун, яма, карта, картошка.
Необходимо составить запрос к таблице на выборку строк в которых есть слова, которые ввел пользователь, при этом так, чтобы строки расположились в порядке "чем больше совпадений тем выше строка". Тоесть строка id4 должна быть первой. За ней следует id2, id1, id3, id6, id 5.
Как составить такой запрос пока у меня самого идей нет.
Есть только предположение, взять строку запроса, разбить на части по каждому ключу извлечь строки, затем сравнивая строки установить порядок. Но это получается очень громоздка и не красиво.
Если у кого-то есть идеи, как решить этот вопрос, буду очень благодарен.
Melkij Ответьте пожалуйста на еще несколько моих вопросов: Нормализацию таблицы предлагаете делать как тут сказано: www.softtime.ru/bookphp/gl12_6.php
match_count - что это такое, в интернете толком ничего не нашел, как я понял - это переменная, я прав?
where keyword in (...) - что такое ... - keyword - это поле, где находятся ключи, а ... что означает?
Нормальная форма реляционной БД - давний технический термин. Объясняется много где и много как. На первый взгляд указанная статья об этом, только как-то очень коротко.
Melkij: Спасибо за разъяснения. Буду учиться. Насколько я понимаю, мой запрос должен выглядеть где-то так:
select id, count(0) as match_count from my_table where keyword in ('Море', 'пальма', 'девушки', 'C++', 'яма', 'google') group by id order by match_count desc
Если так, то я не совсем понял смысл создания отдельной таблицы с ключевыми словами.
Melkij нашел статью, в которой объясняется то, о чем вы вели речь. www.php.su/articles/?cat=examples&page=026
Вопрос что такое: your_table.blob - обязательный ли это элемент?
У меня есть готовая таблица ключевых слов: их около 500 на данный момент.
Есть таблица с данными (20.000 записей).
На мой взгляд никаких "двоичных больших объектов" нам не надо.
Это больше похоже на попытку сделать текстовый поиск.
Нет, это не то, о чём написан исходный ваш вопрос.
Исходный пример:
id1: Пальма, яма, Алексей, котики, погода.
id2: С++, яма, море.
В одном поле понаписано несколько элементов данных - так это работать не будет.
Ключевые слова выкидываются в отдельную таблицу и разносятся как связь 1:М. Получается таблица из двух полей:
id1: Пальма
id1: яма
id1: Алексей
id1: котики
id1: погода
id2: С++
id2: яма
id2: море
Вот так уже можно легко и быстро искать по этим ключевым словам.
При том, и для id1 и для id2 есть слово "яма". Значит, схема ещё не в нормальной форме, есть дублирование данных. С точки зрения реляционной теории нужно сделать отдельную таблицу ключевых слов:
1 - котики
2 - яма
И отдельно таблицу для реализации связи М:М
id1 - 1
id1 - 2
id2 - 2
Нужно ли делать М:М или достаточно денормализованной предыдущей реализации вопрос отдельный. Конкретно для ключевых фраз я не считаю нужным их нормализовать полностью, много лишних действий, а профит довольно неочевидный.
Melkij:
Сейчас у меня запрос выглядит так:
$querywords="'apple','row'";
$result = mysql_query("
select id, count(0) as match_count from keywords
where keyword in ('$querywords')
group by id
order by match_count desc");
Мне при попытке выполнить запросы выдает следующее:
Errors : Query was empty
При этом таблица ключевых слов:
id1: apple
id1: row
id1: moon
id1: tea
id2: cat
id2: dog
id2: tea
id2: coffee
id4: light
id4: comp
id4: apple
id4: row