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

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

Разработка отдельных фрагментов сайтов, консультации по вопросам верстки веб-страниц и веб-программирования.

Полнотекстовый поиск. Временные таблицы

Полнотекстовый поиск

Полнотекстовый поиск

Полнотекстовой поиск с СУБД MySQL на сегодняшний день подтверждается только для таблиц типа MyISAM и только для текстовых столбцов переменной длины (TEXT и VARCHAR). Эта возможность активируется созданием индекса типа FULLTEXT для столбцов, по которым необходимо осуществить поиск.

Примечание. Полнотекстовый поиск в СУБД MySQL не чувствителен к регистру. Кроме того, при поиске игнорируются так называемые "общеупотребительные" слова. К ним относятся слишком котроткие слова (по умолчанию состоящие меньше, чем из четырех символов), а также слова, встречающиеся, по крайней мере, в половине записей. Так если в таблице имеются только две записи, то поиск не даст результатов, поскольку каждое слово будет присутствовать в половине записей.

Для использования возможности полнотекстового поиска в таблице, содержащей текстовые поля, необходимо создать индексы FULLTEXT. Изменить уже существующие таблицы можно при помощи SQL-оператора ALTER.

SQL-оператора ALTER для добавления индекса FULLTEXT для поля name

SQL-оператора ALTER для добавления индекса FULLTEXT для поля name

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

Индекс FULLTEXT можно создать сразу по нескольким столбцам. Для этого в скобках после имени индекса нужно указать имена двух столбцов через запятую:

Индекс  FULLTEXT  можно создать сразу по нескольким столбцам. Для этого в скобках после имени индекса нужно указать имена двух столбцов через запятую

Примечание. Если индекс создается только по одному столбцу и его имя совпадает с именем столбца, то имя индекса, размещаемое после ключевого слова FULLTEXT, можно опустить.

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

На количество индексов в таблице ограничения также не накладываются, допустимо создание нескольких индексов

Поиск выполняется при помощи функции MATCH(), в качестве аргумента которой выступает один или более индексов типа FULLTEXT, а также функция AGAINST(), которая принимает в качестве аргумента искомую строку.

Оператор SELECT, осуществляющий полнотекстовой поиск

Оператор SELECT, осуществляющий полнотекстовой поиск

или так

Оператор SELECT, осуществляющий полнотекстовой поиск

Результат одинаковый. В данных примерах из таблицы tb3 извлекаются все записи соответствующие статьям, в названии которых встречается слово "Антон" и "anton@mail.ru". Синтаксис допускает использование нескольких конструкций MATCH() — AGAINST() после оператора WHERE, разделенных логическими операторами OR или AND.

Синтаксис допускает использование нескольких конструкций  MATCH() — AGAINST() после оператора WHERE, разделенных логическими операторами OR или AND

В данном примере из талицы tb3 извлекаются все записи, соответствующие статьям, в теле которых присутствует слово "Антон", либо слово "Глеб".

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

Временные таблицы

База данных MySQL допускает создание временныз таблиц, предназначенных для хранения IP-адресов посетителей и состоящих из четырех полей:

  • id_ip —первичный ключ таблицы;
  • ip — IP-адрес посетителя;
  • id_user — вторичный ключ, устанавливающий дополнительную связь с таблицей посетителей users. В таблице users этот ключ выступает в качестве первичного; putdate — время посещения.

Необходимо решить следующую задачу — выбрать последний IP-адрес для каждого посетителя и время, когда он в него зашел. Данную задачу можно решить в два этапа. Сначала выбрать вторичные ключи пользователей id_user и соответствующее им время последнего посещения, а затем в цикле выбрать соответствующие им IP-адреса.

<?php
//Устанавливаем соединение с базой данных
require_once("../../config/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, созданная в памяти, будет удаляться автоматически.