gpt4 book ai didi

php - 搜索具有多个条件的内连接

转载 作者:行者123 更新时间:2023-11-29 23:40:36 25 4
gpt4 key购买 nike

我正在尝试创建一个搜索功能,通过书名、书作者、书 ISBN 或通过关键字(通过内连接复合表连接到书)进行搜索。我没有得到我正在寻找的结果;

根据我的搜索内容,我得到以下结果之一:

  • 如果搜索词(例如,出现在书名和关键字名称列中),它有时会返回重复的结果。假设我正在搜索“hulk”并且“hulk”出现在书名上以及该书的连接关键字上,它将返回同一本书两次等
  • 它仅搜索关键字表,并忽略其他“OR WHERE”子句,以便在其他指定列中搜索。

我已经尝试过“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 表//这个表是为一本书分配关键字的地方

    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

}

最佳答案

我会更好地格式化 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

抱歉,我无法真正测试这个,因为我没有可以使用的数据库。

关于php - 搜索具有多个条件的内连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26177985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com