Z góry przepraszam za odkopywanie starego tematu, ale robię podobny projekt i też chcę na podobnej zasadzie rozwiązać mechanizm wyszukiwania, tylko bazę danych mam rozwiązaną w inny sposób. Mam osobną tabelę na książki, osobną tabelę na autorów, tabelę łączącą(relacja wiele do wielu) itd.
Deklaracja tabel:
CREATE TABLE IF NOT EXISTS `ksiazki` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`tytul` varchar(200) COLLATE utf8_polish_ci NOT NULL,
`wydanie` int(11) DEFAULT NULL,
`miejsce_wydania` varchar(20) COLLATE utf8_polish_ci NOT NULL,
`wydawnictwo` varchar(20) COLLATE utf8_polish_ci NOT NULL,
`rok_wydania` int(11) NOT NULL,
`haslo_przedmiotowe` varchar(20) COLLATE utf8_polish_ci NOT NULL,
`ISBN` varchar(17) COLLATE utf8_polish_ci NOT NULL,
`komentarz` varchar(500) COLLATE utf8_polish_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ISBN` (`ISBN`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=12 ;
CREATE TABLE IF NOT EXISTS `autorzy` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`imie` varchar(20) COLLATE utf8_polish_ci NOT NULL,
`nazwisko` varchar(35) COLLATE utf8_polish_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=23 ;
CREATE TABLE IF NOT EXISTS `autorzy_to_ksiazki` (
`autor_id` int(11) NOT NULL,
`ksiazka_id` int(11) NOT NULL,
KEY `autor_id` (`autor_id`,`ksiazka_id`),
KEY `ksiazka_id` (`ksiazka_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
CREATE TABLE IF NOT EXISTS `hasla_przedmiotowe` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`haslo` varchar(20) COLLATE utf8_polish_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=3 ;
CREATE TABLE IF NOT EXISTS `slowa_kluczowe` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`slowo_klucz` varchar(20) COLLATE utf8_polish_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `slowo_klucz` (`slowo_klucz`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=2 ;
CREATE TABLE IF NOT EXISTS `slowa_to_ksiazki` (
`slowo_id` int(11) NOT NULL,
`ksiazka_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
ALTER TABLE `autorzy_to_ksiazki`
ADD CONSTRAINT `autorzy_to_ksiazki_ibfk_2` FOREIGN KEY (`ksiazka_id`) REFERENCES `ksiazki` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `autorzy_to_ksiazki_ibfk_3` FOREIGN KEY (`autor_id`) REFERENCES `autorzy` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
Chciałbym wyszukiwać to w ten sposób, że każde dodatkowe wypełnione pole w formularzu dopełnia zapytanie, a pola będą takie: tytul, imie nazwisko, haslo_przedmiotowe, slowo_kluczowe, rok_wydania.
I zapytanie, które używam dotychczas wygląda tak:
$where = "where k.tytul like '%".$_POST["tytul"]."%' and a.nazwisko like '%".$_POST["autor"]."%'
and k.rok_wydania like '%".$_POST["rok_wydania"]."%' and k.haslo_przedmiotowe like '%".$_POST["haslo_przedmiotowe"]."%' ";
$sql = 'select * from bibliografia.ksiazki as k, bibliografia.autorzy as a '.$where;
Ale to jest bez sensu, bo nie zwraca mi tego co bym chciał, a zwraca mi wszystko co jest w bibliografia.autorzy.
I moje pytanie jest takie, czy w ogóle da się to zrobić jednym zapytaniem, biorąc pod uwagę, że jedna książka może mieć wiele autorów i wiele słów kluczowych przypisanych do niej, a jeżeli tak, to jak mniej więcej schematycznie miało by wyglądać to zapytanie, bo wiem, że będzie dosyć złożone i sam nie wiem jak je wykombinować.