Функция пользовательского поиска SQL: невозможно объединить две таблицы - PullRequest
2 голосов
/ 30 мая 2011
  // grab the search types.
  $searchSQL = "SELECT  * FROM jsprofile WHERE ";

  $types = array();
  $types[] = isset($_GET['sicno'])?"`name` LIKE '%{$searchTermDB}%'":'';
  $types[] = isset($_GET['sname'])?"`icno` LIKE '%{$searchTermDB1}%'":'';
  $types[] = isset($_GET['sgender'])?"`gender` LIKE '%{$searchTermDB2}%'":'';

  $types = array_filter($types, "removeEmpty"); // removes any item that was empty (not checked)

  if (count($types) < 1)
     $types[] = "`icno` LIKE '%{$searchTermDB}%'"; // use the body as a default search if none are checked

      $andOr = isset($_GET['matchall'])?'AND':'AND';
  $searchSQL .= implode(" {$andOr} ", $types) . "  ORDER BY `icno`"; // order by title.

  $searchResult = mysql_query($searchSQL) or trigger_error("There was an error.<br/>" . mysql_error() . "<br />SQL Was: {$searchSQL}");

//  if (mysql_num_rows($searchResult) < 1) {
  ///   $error[] = "The search term provided {$searchTerms} yielded no results.";

С этого момента все работает отлично. Я могу искать ... однако, когда я попытался объединить две таблицы ..

  // grab the search types.
  $searchSQL = "SELECT  * FROM jsprofile INNER JOIN medi WHERE ";

  $types = array();
  $types[] = isset($_GET['sicno'])?"`name` LIKE '%{$searchTermDB}%'":'';
  $types[] = isset($_GET['sname'])?"`icno` LIKE '%{$searchTermDB1}%'":'';
  $types[] = isset($_GET['sgender'])?"`gender` LIKE '%{$searchTermDB2}%'":'';
  $types[] = isset($_GET['medical'])?"`medical` LIKE '%{$searchTermDB2}%'":'';

  $types = array_filter($types, "removeEmpty"); // removes any item that was empty (not checked)

  if (count($types) < 1)
     $types[] = "`icno` LIKE '%{$searchTermDB}%'"; // use the body as a default search if none are checked

      $andOr = isset($_GET['matchall'])?'AND':'AND';
  $searchSQL .= implode(" {$andOr} ", $types) . "  ORDER BY `icno`"; // order by title.

  $searchResult = mysql_query($searchSQL) or trigger_error("There was an error.<br/>" . mysql_error() . "<br />SQL Was: {$searchSQL}");

//  if (mysql_num_rows($searchResult) < 1) {
  ///   $error[] = "The search term provided {$searchTerms} yielded no results.";

Когда я это сделал .. кажется, ничего не выходит, что-то не так с запросом?

Ответы [ 2 ]

1 голос
/ 30 мая 2011

Для начала:

$searchSQL = "SELECT  * FROM jsprofile INNER JOIN medi WHERE ";

... допустимо только в MySQL, где INNER JOIN, в котором отсутствуют критерии для связывания таблиц, интерпретируется как CROSS JOIN - создание декартового произведения. Это означает, что он будет производить строки, но будет каждая запись medi, связанная с каждой таблицей jsprofile, и наоборот.

Пока есть записи, основанные на критериях поиска, запрос будет возвращать результаты - но только не хорошие. Поэтому вам придется объяснить «ничего не выходит» для полезного ответа ...

Второй, используя:

$searchSQL = "SELECT  * FROM jsprofile ... WHERE 1 = 1 ";

... позволит вам объединять дополнительные предложения WHERE, если они начинаются с "AND ...":

$types[] = isset($_GET['sicno'])?" AND `name` LIKE '%{$searchTermDB}%'":'';

... без необходимости уже определенной вами логики.

В-третьих, использование Полнотекстового поиска (FTS) было бы проще и быстрее, чем использование LIKE с подстановочными знаками слева, потому что подстановочный знак слева от LIKE отображает любой индекс в столбце непригодным для использования. Тем не менее, MySQL FTS требует, чтобы поиск таблиц выполнялся с использованием механизма MyISAM. Для достижения той же функциональности используйте сторонние инструменты, такие как Sphinx.

WHERE MATCH(column1, column2) AGAINST ($searchTerm)
1 голос
/ 30 мая 2011

Вы должны проверить синтаксис MySQL JOIN (http://dev.mysql.com/doc/refman/5.0/en/join.html)

, вам нужно поместить туда ON

эту строку:

$searchSQL = "SELECT  * FROM jsprofile INNER JOIN medi WHERE ";

быть примерно таким:

$searchSQL = "SELECT  * FROM jsprofile INNER JOIN medi On jsprofile.[key] = medi.[key] WHERE ";

очевидно, подставьте имена ваших ключей в этот запрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...