我正在使用PHP和MySQL,并希望根据以下标准检索查询:
其中book_title =搜索查询结果或book_keyword =搜索查询结果
和
其中检索的所有图书的日期都大于今天。
这是我头脑风暴但似乎没有正确的意义,除了过滤日期(它显示日期早于当前日期的书籍)之外,一切运作良好。
$get_crs = mysql_query("select * from books
where book_title like '%$search_query%'
OR book_keywords like '%$search_query%'
AND book_date1 >= CURRENT_DATE() ORDER BY book_date1");
任何帮助将不胜感激。
答案 0 :(得分:1)
这是一个优先问题。 AND
优先于OR
,因此对于数据库引擎,您的查询如下所示:
SELECT * FROM books
WHERE ( book_title LIKE '%$search_query%' )
OR ( book_keywords LIKE '%$search_query%'
AND book_date1 >= CURRENT_DATE() )
ORDER BY book_date1
您需要通过执行以下操作来强制执行正确的优先级(围绕两个LIKE
的括号):
SELECT * FROM books
WHERE ( book_title LIKE '%$search_query%'
OR book_keywords LIKE '%$search_query%' )
AND book_date1 >= CURRENT_DATE()
ORDER BY book_date1
或者,您可以执行以下操作:
SELECT * FROM books
WHERE CONCAT( book_title, '|', book_keywords ) LIKE '%$search_query%'
AND book_date1 >= CURRENT_DATE()
ORDER BY book_date1
另一方面,SELECT *
并不是一个好主意。您应该明确命名要返回的列。不是因为安全性,而是因为您可能返回的数据超出实际需要的数量。您还强制数据库引擎查找应该返回哪些列。
答案 1 :(得分:0)
我会邀请你的问题是"或"运。尝试将括号强制为正确的逻辑顺序":
select * from books where (book_title like '%$search_query%' OR book_keywords like '%$search_query%') AND book_date1 >= CURRENT_DATE() ORDER BY book_date1
答案 2 :(得分:0)
首先请确保$search_query
已正确清理,否则您很容易被SQL注入。
要进行查询,请添加括号:
$get_crs = mysql_query("select * from books where (book_title like '%$search_query%' OR book_keywords like '%$search_query%') AND book_date1 >= CURRENT_DATE() ORDER BY book_date1");
这样可以获得与()
中的任一查询匹配的图书,然后只会获得current_date
之后的图书。