php - MySQL WHERE 结果基于先前的 WHERE 子句

标签 php mysql sql where-clause

抱歉,如果有一个简单的 Mysql 方法可以做到这一点,但我发现很难用语言来获得任何有意义的搜索结果。

我正在搜索我的网站,搜索工作正常,直到我尝试根据下拉列表中选定的流派通过单词进行搜索。

这个查询最能代表我想要做的事情:

SELECT *
FROM Books
JOIN bookauthor ON books.BookID = bookauthor.BookID 
JOIN authors ON bookauthor.AuthorID = authors.AuthorID 
JOIN bookgenre ON books.BookID = bookgenre.BookID 
JOIN genre ON bookgenre.GenreID = genre.GenreID 
WHERE genre.Genre = 'Fantasy' 
WHERE books.BookName LIKE '%$variable%' OR authors.Forename LIKE '%$variable%' OR authors.Surname LIKE '%$variable%' 
GROUP BY books.BookName ORDER BY authors.AuthorID

我想选择所有已选择类型的书籍,然后从中进行其他检查,因为现在 OR 会覆盖其他检查,最终会吐出每条记录。

我猜我可能需要有一个查询来选择该类型的所有书籍,然后运行另一个查询来从上一个查询中进行选择。只是我以前从未这样做过,我需要将其合并到我的搜索功能中......

这是我当前的搜索代码,除了尝试搜索选择“全部”以外的流派的内容时,它工作得很好,如果您只选择一种流派并且不输入任何内容,它将显示该流派的书籍,只是如果您也输入搜索词,则不会。

if(isset($_POST['search']))
            {
                if($_POST['genre']!="All")
                    {
                    $where3 = "WHERE genre.GenreID = '".$_POST['genre']."'";        
                    }
                if($_POST['field'] == "All")
                    {
                        if(str_word_count($_POST['find'])>=2)
                        {
                        $findEx = explode(' ', $_POST['find']);
                        $where2 = "OR authors.Forename LIKE  '%".($findEx[0])."%' AND authors.Surname LIKE  '%".$findEx[1]."%'";
                        }
                    $where = "
                    WHERE books.BookName LIKE  '%".($_POST['find'])."%'
                    OR  authors.Forename LIKE  '%".($_POST['find'])."%' OR authors.Surname LIKE  '%".($_POST['find'])."%'
                    $where2
                    ";
                    }
                else if($_POST['field'] == "Books")
                    {
                    $where = "WHERE books.BookName LIKE  '%".($_POST['find'])."%'";
                    }
                else if($_POST['field'] == "Authors")
                    {
                    if(str_word_count($_POST['find'])>=2)
                        {
                        $findEx = explode(' ', $_POST['find']);
                        $where = "WHERE authors.Forename LIKE  '%".($findEx[0])."%' AND authors.Surname LIKE  '%".$_POST[1]."%'";
                        }
                    else
                        {
                        $where = "WHERE authors.Forename LIKE  '%".($_POST['find'])."%' OR authors.Surname LIKE  '%".($_POST['find'])."%'";
                        }
                    }                       
                    $sql = "SELECT * FROM Books
                        JOIN bookauthor ON books.BookID        = bookauthor.BookID
                        JOIN authors    ON bookauthor.AuthorID = authors.AuthorID
                        JOIN bookgenre  ON books.BookID        = bookgenre.BookID
                        JOIN genre      ON bookgenre.GenreID   = genre.GenreID
                        ".$where3."
                        ".$where."
                        GROUP BY books.BookName                                
                        ORDER BY authors.AuthorID"; 
                        echo $sql;
            }

我对这一切还很陌生,所以很抱歉,如果我的搜索代码看起来像一场噩梦,它可以用最少的代码满足我的需要,尽管欢迎任何提示。

感谢所有帮助 - 汤姆

最佳答案

也许

SELECT *
FROM Books
JOIN bookauthor ON books.BookID = bookauthor.BookID 
JOIN authors ON bookauthor.AuthorID = authors.AuthorID 
JOIN bookgenre ON books.BookID = bookgenre.BookID 
JOIN genre ON bookgenre.GenreID = genre.GenreID 
WHERE genre.Genre = 'Fantasy' 
AND books.BookName LIKE '%$variable%' (OR authors.Forename LIKE '%$variable%' OR authors.Surname LIKE '%$variable%') 
GROUP BY books.BookName ORDER BY authors.AuthorID

关于php - MySQL WHERE 结果基于先前的 WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20384431/

相关文章:

MySQL 计数返回 0

php - mySQL 数据库未从表单更新

用于检查用户名和密码字段的 Javascript 函数,如果它们没有相应地完成则停止

mysql - 内连接关键字搜索的SQL数据库索引设计

javascript - 无法通过 ajax 调用加载 php 页面

mysql - 根据可变时期对日期进行分组

c# - 在 c# 中运行一个简单的 sql server 查询

mysql - 分组在一张表中

php - 如何使用 UNION 在 mysql 中选择两个表?

php - 联系表单验证问题