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

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

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

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

я пробовал «SELECT DISTINCT ..» SQL заявление, но все еще не работает

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

  1. book table // книжная информация хранится

    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` double 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 table // эта таблица, где книге присваивается ключевое слово

    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 код /////

$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

}

0

Решение

Я бы лучше отформатировал 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,

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

0

Другие решения

Причина, по которой он игнорирует дополнительное условие WHERE, заключается в том, что все ваши объединения являются ВНУТРЕННИМИ объединениями. Использование левых объединений покажет результаты, если что-либо в предложении 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;
0

По вопросам рекламы [email protected]