Поиск внутреннего соединения с несколькими условиями

Я пытаюсь создать функцию поиска, которая выполняет поиск по названию книги, автору книги, книжке ISBN или с помощью ключевых слов (которые связаны с книгами через встроенную комбинированную таблицу). im не получать результаты, которые я ищу;

в зависимости от того, что я ищу, я получаю любой из этих результатов:

  • он иногда возвращает повторяющиеся результаты, если термин поиска, например, появляется в заголовке книги и в столбце имени ключевого слова. скажем, если я ищу "****" и "****" появляется в названии книги, и эта книга присоединилась к ключевому слову, она вернет ту же самую книгу дважды и т.д.
  • он выполняет поиск только по таблице ключевых слов и игнорирует другие предложения "ИЛИ ГДЕ" для поиска в других указанных столбцах.

Я попытался выполнить команду SELECT DISTINCT.. sql, но все еще не работает

Таблицы в базе данных:

  1. книжный стол//книга информация магазин

    CREATE TABLE IF NOT EXISTS books (
    book_id' int(11) NOT NULL AUTO_INCREMENT,
    book_title' varchar(100) NOT NULL,
    book_author' varchar(100) NOT NULL,
    book_ISBN' varchar(100) NOT NULL,
    book_description' varchar(1000) NOT NULL,
    book_price' ****** NOT NULL,
    book_image' varchar(100) NOT NULL,
    book_stock_quantity' int(11) NOT NULL,
    PRIMARY KEY ('book_id')
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=61 ;
  2. Таблица book_keyword//эта таблица - это то, где книге присваивается ключевое слово

    CREATE TABLE IF NOT EXISTS books_keyword (
    books_keyword_book_id' int(10) NOT NULL,
    books_keyword_keyword_id' int(10) NOT NULL,
    KEY 'BOOK_FK' ('books_keyword_book_id'),
    KEY 'KEYWORD_FK' ('books_keyword_keyword_id')
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  3. таблица ключевых слов

    CREATE TABLE keyword (
    keyword_id' int(10) NOT NULL AUTO_INCREMENT,
    keyword_name' varchar(50) NOT NULL,
    PRIMARY KEY ('keyword_id')
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

///php code/////

$search = $_POST["Search"]; // get text from textbox and insert into variable
$mysqli = new mysqli('localhost', 'root','','bookstore'); //connect to database
$searchSQL = "SELECT books.*, books_keyword.books_keyword_keyword_id AS keyword_id, keyword.keyword_name FROM books JOIN books_keyword ON (books.book_id = books_keyword_book_id) JOIN keyword ON(books_keyword.books_keyword_keyword_id = keyword_id) WHERE keyword_name LIKE '%" . $search . "%' OR book_title LIKE '%" . $search . "%' OR book_ISBN LIKE '" . $search ."' OR book_author LIKE '%" . $search ."%'";
$Results = $mysqli->query($SearchSql); //run sql
while($SearchRow = $Results->fetch_assoc()) //print out each result { echo '<p>'.$SearchRow["book_title"].'</p>'; //echo book title in the search results }
2 ответа

Я бы немного форматировал SQL. Это облегчает обнаружение ошибок.

SELECT books.*, GROUP_CONCAT(DISTINCT books_keyword.books_keyword_keyword_id SEPARATOR ',') AS keyword_ids, GROUP_CONCAT(DISTINCT keyword.keyword_name SEPARATOR ',') AD keyword_names
FROM books
JOIN books_keyword ON (books.book_id = books_keyword.books_keyword_book_id)
JOIN keyword ON (books_keyword.books_keyword_keyword_id = keyword.keyword_id)
WHERE keyword.keyword_name LIKE '%".$search."%' OR books.book_title LIKE '%".$search."%' OR books.book_ISBN LIKE '".$search."' OR books.book_author LIKE '%".$search ."%'";
GROUP BY books.book_id

Трюк состоит в том, чтобы группировать книги. Обратите внимание, что у вас может быть несколько ключевых слов. Поэтому я использовал функцию группировки GROUP_CONCAT.

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


Причина, по которой он игнорирует дополнительное условие WHERE, заключается в том, что все ваши соединения являются INNER-соединениями. Использование левых объединений будет показывать результаты, если что-либо в предложении where, а не в принудительном порядке JOIN. Проблема дублирования результатов может быть решена с помощью GROUP BY:

SELECT books.*, books_keyword.books_keyword_keyword_id AS keyword_id, keyword.keyword_name
FROM books
LEFT JOIN books_keyword ON (books.book_id = books_keyword_book_id)
LEFT JOIN keyword ON(books_keyword.books_keyword_keyword_id = keyword_id)
WHERE keyword_name LIKE '%" . $search . "%' OR book_title LIKE '%" . $search . "%' OR book_ISBN LIKE '" . $search ."' OR book_author LIKE '%" . $search ."%'
GROUP BY books.book_id;

licensed under cc by-sa 3.0 with attribution.