SQL - złożone zapytanie (może z pozoru)

0

Witam wszystkich
Potrzebuję pomocy w skonstruowaniu zapytania SQL (PHP). Mianowicie mam jednego inputa na stronie do którego wpisuję kryteria: imię, nazwisko, PESEL, NIP, adres mieszkania.
wszystko może być OR lub AND. Np. Wpisując Maciej Swobodna powinna wyświetlić mi się lista osób które mieszkają na ul. Swobodnej i mają na imię Maciej, wpisując Swobodna 9, powinni wyświetlić mi się wszyscy którzy mieszkają na Swobodnej 9(nr budynku) lub mieszkają na Swobodnej i mają nr mieszkania 9 (czyli np. Swobodna 27/89, Swobodna 31/9 itp) tak samo z nipem, peselem... po wpisaniu "Swobodna 950" dopuszczalne jest wyświetlenie listy ludzi którzy mieszkają na swobodnej i w ich PESELu/NIPie jest fraza "950".

Zapytanie wyświetlające wszystkie pola z kilku tabel potrzebne do wyszukania:
sql SELECT a.* FROM `mieszkanie_abonent` as ma, `mieszkanie` as m, `abonent` as a, `budynki` as b, `miasta` as mi, `ulice` as u WHERE a.id_abonent=ma.id_abonent AND ma.id_mieszkanie=m.id_mieszkanie AND m.id_budynku=b.id AND b.id_miasto=mi.id AND b.ulica=u.id

0

Do łączenia tabel użyj (LEFT) JOINA, a do WHERE wpisz odpowiednie wartości (z inputow) do LIKE i połącz je AND.

0

Właśnie w tym sęk że to będzie jeden input, czyli tj pisałem wyżej, w nim można wpisać: imię, nazwisko, PESEL, NIP, adres mieszkania. W tym jednym inpucie. I teraz pytanie, jak to wyszukać... Żeby był żądany efekt.

0

Zakładam, że silnik to MySQL ze wsparciem dla REGEXP.
Może tak:

SELECT a.* FROM 
	`mieszkanie_abonent` as ma, 
	`mieszkanie` as m, 
	`abonent` as a, 
	`budynki` as b, 
	`miasta` as mi, 
	`ulice` as u 
WHERE 
	a.id_abonent=ma.id_abonent 
AND ma.id_mieszkanie=m.id_mieszkanie 
AND m.id_budynku=b.id 
AND b.id_miasto=mi.id 
AND b.ulica=u.i
AND (
	a.kolumna regexp 'A|B|C' or 
	ma.inna_kolumna regexp 'A|B|C' or 
	m.jeszcze_inna_kolumna regexp 'A|B|C' or 
	b.kolejna_kolumna regexp 'A|B|C'
);

"A|B|C" to jest Twój input, na którym wykonujesz następujące operacje:

  • usuwasz wiodące, końcowe spacje
  • wielokrotne spacje zamieniasz na pojedyńczą
  • zamieniasz spację na |
  • znaki mające znaszenie dla REGEXP "escapujesz" (nie wiem jaka jest składnia "escapowanie" znaków specjalnych w wyrażenaich regularnych w MySQLa)

Np. " Jan Kowalski Swobodna 950 " -> Jan|Kowalski|Swobodna|950

0

Poza tym, że wydaje mi się, że to bardzo zły pomysł. Możesz zrobić FULL JOIN następnie

WHERE col1 ilike '%input%' or col2 ilike '%input%'

i tak dalej

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