Извините, если есть простой способ Mysql для этого, но мне сложно говорить, чтобы получить какие-либо значимые результаты поиска.MySQL WHERE результат на основе предыдущего предложения WHERE
Я занимаюсь поиском своего сайта, и поиск работает нормально, пока я не попытаюсь его найти по слову, основанному на выбранном жанре, из раскрывающегося списка.
Этот запрос, который лучше всего представляет то, что я пытаюсь сделать:
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;
}
Я все еще достаточно новое для всего этого, так что извините, если мой код поиска похож на кошмар, он делает то, что мне нужно в наименьшем количестве кода, хотя любые советы приветствуются.
Все оцененная помощь -Tom
Используйте И вместо второго WHERE. – Mihai
Всегда хорошая практика, чтобы положить скобки вокруг OR, а также – stuartd
Ненавижу кричать, но ВЫ ИСПОЛЬЗУЕТЕ ИСПОЛЬЗОВАТЬ! ВАШ ЦЕЛЫЙ ВОПРОС - ИНСТРУКЦИЯ. ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ, КАК ИСПОЛЬЗОВАТЬ ПОДГОТОВЛЕННЫЕ ЗАЯВЛЕНИЯ ИЛИ ИЗБРАННЫЕ ПЕРЕМЕННЫЕ ДЛЯ SQL. http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php – Sven