2014-10-03 64 views
0

我試圖創建一個搜索功能,通過書名,書籍作者,書籍ISBN或通過關鍵字(通過內部連接複合表連接到書籍)進行搜索。我沒有得到我期待的結果;搜索多個條件的內部連接

取決於我搜索我得到這兩種結果:

  • 它有時會返回重複的結果,如果搜索詞e.g出現在書的標題和關鍵字名稱列。如果我在書名和該書的加入關鍵詞上出現「hulk」和「hulk」字樣,它將返回同一書兩次等。
  • 它只搜索關鍵字表並忽略其他「 OR WHERE「條款來搜索其他指定的列。

我已經嘗試了 「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` 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表//這張表是書籍分配關鍵字的地方

    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稍微好一點。這使得更容易發現錯誤。

​​

訣竅是按書籍分組。請注意,您可能有幾個關鍵字點擊。因此我使用了分組功能GROUP_CONCAT

對不起,我無法真正測試這個,因爲我沒有數據庫可以使用。

0

的原因,它忽略了額外的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;