2012-05-13 3 views
1

Подробное

Представьте себе, что у нас есть таблицы, которая выглядит так:Как искать в нескольких таблиц в MySQL

enter image description here

Как вы видите, questions связан с 4 таблиц через внешний ключ.

Использование Datatables с server-side processing (я модифицировал данный PHP-код для работы с несколькими таблицами) для клиентов.

Вопрос

То, что я хочу сделать, это следующее: когда пользователь ищет что-то, посылает ключевые слова клиентской через AJAX в ServerSide. Кусок кода, который обрабатывает поиск на официальном сайте (link to page) выглядит следующим образом:

$sWhere = ""; 
if (isset($_GET['sSearch']) && $_GET['sSearch'] != "") 
{ 
    $sWhere = "WHERE ("; 
    for ($i=0 ; $i<count($aColumns) ; $i++) 
    { 
     $sWhere .= "`".$aColumns[$i]."` LIKE '%".mysql_real_escape_string($_GET['sSearch'])."%' OR "; 
    } 
    $sWhere = substr_replace($sWhere, "", -3); 
    $sWhere .= ')'; 
} 

Я хочу изменить эту часть, чтобы обрабатывать несколько обработок таблицы.

Для примера: Если пользователь ввел имя какого-либо раздела (имя находится в таблице sections, столбец section), как я могу найти вопросы (от questions table), связанные с этим разделом? Возможно ли это с одним и единственным запросом?

Любые предложения будут высоко оценены :)

+3

Вы хотите взглянуть на операторы SQL 'join' –

+0

Пока: избавиться от таблицы предметов. (или ссылаться на него через таблицы N <> M) – wildplasser

+0

@wildplasser Я не могу избавиться. Это очень хорошая структура. Здесь была единственная проблема. На самом деле проблема может быть решена с огромным количеством кода. Но я ищу новую идею. BTW, что вы подразумеваете под ссылкой через N <> M tables'? –

ответ

0

Вы не должны использовать LIKE оператора для этого на всех, особенно если эти таблицы могут вырасти за несколько сот строк. LIKE с подстановочным знаком впереди (например, LIKE '%key' или LIKE '%key%') не может использовать индексы для оптимизации поиска, а это означает, что эти запросы могут стать довольно медленными только с тысячами строк.

В идеале вы должны построить денормализованную структуру, содержащую любую текстовую информацию в одной строке, а затем бросить ее в полнотекстовый поиск и вместо этого использовать для запросов. Это может быть ключ FULLTEXT, который MySQL поддерживает в моих таблицах MyISAM или внешнюю полнотекстовую поисковую систему, например Sphinx (http://www.sphinxsearch.com/).

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

Это не означает, что вам следует избавиться от базовых структур, но для создания эффективного решения для таких поисков вам придется ввести некоторое дублирование данных.

0

вы можете использовать Union Select и объединить результаты. просто использовать союз с тем же выбранными столбцами в предыдущем выберите:

$sWhere = ""; 
if (isset($_GET['sSearch']) && $_GET['sSearch'] != "") 
{ 
    $sWhere = "WHERE ("; 
    for ($i=0 ; $i<count($aColumns) ; $i++) 
    { 
     $sWhere .= "`".$aColumns[$i]."` LIKE '%".mysql_real_escape_string($_GET['sSearch'])."%' OR "; 
    } 
    $sWhere = substr_replace($sWhere, "", -3); 
    $sWhere .= ')'; 


    $sWhere .= ' UNION SELECT question FROM questions , sections WHERE (sections.`section` LIKE '%".mysql_real_escape_string($_GET['sSearch'])."%' AND questions.section = sections.id) "; //this union in select columns count must be same with your previous Select columns count 

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