2013-12-04 4 views
0

Извините, если есть простой способ 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

+0

Используйте И вместо второго WHERE. – Mihai

+0

Всегда хорошая практика, чтобы положить скобки вокруг OR, а также – stuartd

+0

Ненавижу кричать, но ВЫ ИСПОЛЬЗУЕТЕ ИСПОЛЬЗОВАТЬ! ВАШ ЦЕЛЫЙ ВОПРОС - ИНСТРУКЦИЯ. ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ, КАК ИСПОЛЬЗОВАТЬ ПОДГОТОВЛЕННЫЕ ЗАЯВЛЕНИЯ ИЛИ ИЗБРАННЫЕ ПЕРЕМЕННЫЕ ДЛЯ SQL. http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php – Sven

ответ

0

Может

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 
+0

Получил рабочий запрос, теперь он просто получил мой PHP-поиск для работы с ним. – Vereonix

Смежные вопросы