Полнотекстовой поиск с СУБД MySQL на сегодняшний день подтверждается только для таблиц типа MyISAM и только для текстовых столбцов переменной длины (TEXT и VARCHAR). Эта возможность активируется созданием индекса типа FULLTEXT для столбцов, по которым необходимо осуществить поиск.
Примечание. Полнотекстовый поиск в СУБД MySQL не чувствителен к регистру. Кроме того, при поиске игнорируются так называемые "общеупотребительные" слова. К ним относятся слишком котроткие слова (по умолчанию состоящие меньше, чем из четырех символов), а также слова, встречающиеся, по крайней мере, в половине записей. Так если в таблице имеются только две записи, то поиск не даст результатов, поскольку каждое слово будет присутствовать в половине записей.
& Для использования возможности полнотекстового поиска в таблице, содержащей текстовые поля, необходимо создать индексы FULLTEXT. Изменить уже существующие таблицы можно при помощи SQL-оператора ALTER.
SQL-оператора ALTER для добавления индекса FULLTEXT для поля name
В листинге сразу после ключевого слова FULLTEXT следует имя создаваемого индекса, за которым в скобках указано имя текстового столбца.
Индекс FULLTEXT можно создать сразу по нескольким столбцам. Для этого в скобках после имени индекса нужно указать имена двух столбцов через запятую:
Примечание. Если индекс создается только по одному столбцу и его имя совпадает с именем столбца, то имя индекса, размещаемое после ключевого слова FULLTEXT, можно опустить.
На количество индексов в таблице ограничения также не накладываются, допустимо создание нескольких индексов:
Поиск выполняется при помощи функции MATCH(), в качестве аргумента которой выступает один или более индексов типа FULLTEXT, а также функция AGAINST(), которая принимает в качестве аргумента искомую строку.
Оператор SELECT, осуществляющий полнотекстовой поиск
или так
Результат одинаковый. В данных примерах из таблицы tb3 извлекаются все записи соответствующие статьям, в названии которых встречается слово "Антон" и "[email protected]". Синтаксис допускает использование нескольких конструкций MATCH() — AGAINST() после оператора WHERE, разделенных логическими операторами OR или AND.
В данном примере из талицы tb3 извлекаются все записи, соответствующие статьям, в теле которых присутствует слово "Антон", либо слово "Глеб".
Примечание. Результаты поиска сортируются в порядке уменьшения релевантности. Величина релевантности представляет собой неотрицательное число с плавающей точкой. Релевантность вычисляется на основе количества слов в данной строке столбца, количества уникальных слов в этой строке, общего количества слов в тексте и числа документов (строк), содержащих отдельное слово.
База данных MySQL допускает создание временныз таблиц, предназначенных для хранения IP-адресов посетителей и состоящих из четырех полей:
Необходимо решить следующую задачу — выбрать последний IP-адрес для каждого посетителя и время, когда он в него зашел. Данную задачу можно решить в два этапа. Сначала выбрать вторичные ключи пользователей id_user и соответствующее им время последнего посещения, а затем в цикле выбрать соответствующие им IP-адреса.
Выбор IP- адреса каждого посетителя и времени посещения
<?php
//Устанавливаем соединение с базой данных
require_once("config.php");
//Формируем SQL-запрос
$query="SELECT DISTINCT(id_user) AS id_user, MAX(putdate) AS max_time FROM ips GROUP BY id_user";
//Выполняем SQL-запрос
$fir=mysql_query($query);
if($fir)
{
while($res=mysql_fetch_array($fir))
{
//в цикле формируем второй запрос
$query="SELECT*FROM ips WHERE id_user=".$res['id_user']."";
$final=mysql_query($query);
$result=mysql_fetch_array($final);
echo $result['ip']."-".$result['putdate']."<br>";
}
}
?>
В окне веб-браузера это будет выглядеть ТАК.
Недостатком такого подхода является выполнение второго запроса в цикле, что может создать серьезную нагрузку на сервер MySQL. Выходом из этой ситуации будет создание временной таблицы с результатами первого запроса.
Создание временной таблицы с результатами запроса
<?php
//Устанавливаем соединение с базой данных
require_once("config.php");
$query="CREATE TEMPORARY TABLE ttt SELECT id_user, putdate, ip FROM ips ORDER BY id_user, time DESC";
if(mysql_query($query))
{
$sel="SELECT id_user, putdate, ip FROM ttt GROUP BY id_user";
$res=mysql_query($sel);
if($res)
{
while($result=mysql_fetch_array($res))
{
echo $result["id_user"]. " ".$result["putdate"]. " ".$result["ip"]."<br>";
}
}
}
?>
После выполнения скрипта таблица ttt, созданная в памяти, будет удаляться автоматически.