[PHP, MySQL] Wyszukiwanie z kilkoma warunkami

0

Mam tabelę z kilkoma kolumnami:

  • model auta
  • rok produkcji
  • kolor lakieru
  • typ
  • data rejestracji
  • stan
  • uszkodzenia
  • ilość drzwi

i wieloma wierszami.

Chcę, np. z tej tabeli wybrać wiersze wg. następujących kategorii wyszukiwania:

  • model auta (1)
  • rok produkcji (2)
  • kolor lakieru (3)
  • typ (4)

w nawiasach podałem priorytety każdej z kategorii.
Podaję że :

  • model=mercedes;
  • rok>1990;
  • kolor=srebrny metalik;
  • typ=kombi;
  • data rejestracji = brak
  • stan = brak
  • uszkodzenia = brak
  • ilość drzwi = brak

Chcę, aby w pierwszej kolejności podało mi mercedesy nie starsze niż rocznik 1990 w kolorze srebrny metalik w kombi a jeżeli takich nie znajdzie to aby wyrzucił na dalszych pozycjach wyszukiwania wyniki wg. priorytetów.

0

Zapytanie:

SELECT *
FROM `samochody`
WHERE `model` LIKE 'mercedes'
AND `rok` > 1990
AND `kolor` LIKE 'srebrny metalik'
AND `typ` LIKE 'kombi'
AND `data rejestracji` LIKE 'brak'
AND `stan` LIKE 'brak'
AND `uszkodzenia` LIKE 'brak'
AND `ilość drzwi` LIKE 'brak'

Ewentualnie to:
LIKE 'brak'
Można zmienić na to:
IS NULL
Jeśli to pole ma być PUSTE.

Jeżeli chcesz w tekście wyszukać słowo 'brak' to w ten sposób:
LIKE '%brak%'

Jeśli nie chcesz danego ciągu w ogóle brać pod uwagę to go skasuj.

Edit Sorry, nie doczytałem ;p
W takim razie to trzeba by było wykonać KILKA zapytań SELECT w instrukcji warunkowej IF. Inaczej tego nie zrobisz. Więc w pseudokodzie tak:

Jeśli (mysql_fetch_row(zapytanie('znajdź mercedesy'))) {
//Znaleziono merce
   Jeśli (mysql_fetch_row(zapytanie('znajdź mercedesy które są młodsze niż 1990r.'))) {
      //Znaleziono merce młodsze niż 1990
   } else {
      //Nie znaleziono merców młodszych niż 1990
   }
} else {
//Nie znaleziono merców
}

Inaczej raczej się nie da.

0

Ok, ale chodzi tu mniej więcej o to, że dane będą podawane z formularza na stronie, więc nie ma możliwości ustalenia na sztywno zapytania do bazy. Wyszukiwarka będzie miała 8 pól, ja chcę żeby serwer wybrał mi wiersze nawet gdy podana zostanie tylko jedna kategoria. W wyżej wymienionym przykładzie przez Demonical Monk jeżeli chociaż jeden z warunków zwróci False to nie będzie wybrany żaden rekord, dobrze rozumiem?

0

Tak. Bo nie doczytałem 2 ostatnich zdań. I mówię Ci że możliwe jest ustalenie zapytania.

<?
//Zakładam że do skryptu podano:
//$model
//$rok

function check($var, $val) {
$result = mysql_query($link, "SELECT * FROM samochody WHERE '.$var.' LIKE '%'.$val.'%'");
if (!mysql_fetch_row($result)) {
return false;
} else {
return true;
}}

if ($model) {

   if (!check('model', $model)) {
      //Nie ma modelu w bazie
      if (!check('rok', $rok)) {
         //Nie ma takiego modelu ani roku
      } else {
         //Jest taki rok, ale nie ma modelu
      }
   } else {
      //Jest model w bazie
      if (!check('rok', $rok)) {
         //Jest model, ale nie ma roku
      } else {
         //Jest taki model i rok
      }
   }
}
?>

Ja się nie wysilałem i żeby Ci to pokazać użyłem 2 zmiennych. Nie mówię że to jest ultra zoptymalizowane, ale w ten sposób można to zrobić. Można to zrobić jeszcze na wiele sposobów.

0

Ok, zakleiłem.

A teraz, gdybym chciał wybrać z bazy wiersze wg. 8 kategorii z których dowolna mogłaby być podana lub nie i posortować to wg. ilości trafień.

0

Trochę rozwinąć podany przeze mnie kod i użyć sort(), ksort() lub asort().
Edit A do liczenia trafień można to przerobić tak:

function check($var, $val) {
$result = mysql_query($link, "SELECT * FROM samochody WHERE '.$var.' LIKE '%'.$val.'%'");
if (!mysql_num_rows($result)) {
return false;
} else {
return mysql_num_rows($result);
}}
0

Można zmodyfikować zapytanie, które napisał @Demonical Monk, ale dać operator OR zamiast AND i wtedy nie trzeba się martwić, czy wszystkie pola są wypełnione wartością.

0

Można też napisać inteligentny skrypt, który zamieniał by AND z OR na wszystkie możliwe sposoby i wyświetlał zapytania z największą liczbą AND na początku (bo chyba na początku są priorytety :)) i trafień. To by było ciekawe...

1 użytkowników online, w tym zalogowanych: 0, gości: 1