[ Pavleg @ 31.08.2007. 14:50 ] @
Kako bi trebao da izgleda ovaj upit:

Code:

SELECT apartmani.ime_apartm, apartmani.glavni_opis,apartmani.lokacija, opisi.dodatni_opisi
FROM apartmani LEFT JOIN opisi
ON apartmani.id_apartm=opisi.id_apartm WHERE 
apartmani.ime_apartm LIKE '%$pretr%' OR apartmani.glavni_opis LIKE '%$pretr%'
OR apartmani.lokacija LIKE '%$pretr%' OR opisi.dodatni_opisi LIKE '%$pretr%' 
GROUP BY apartmani.ime_apartm


Ovako sam ga ja zamislio i znam da se ne može tako napisati (OR i ne postoji).

U pitanju search forma koja treba da pretraži dvije table (apartmani i opisi) - njihova polja
(apartmani.ime_apartm, apartmani.glavni_opis, apartmani.lokacija,
opisi.dodatni_opisi) da li sadži reč koja je unesena za pretragu ($pretr).
Odgovor na pretragu ne bi trebao da ima duplikate,
odnosno, samo jedan apartman da se izlista od mogućih više razultata za isti apartma.


Te dve tabele izgledaju ovako:

Code:

CREATE TABLE apartmani (
id_apartm INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
ime_apartm VARCHAR(25) NOT NULL,  
glavni_opis TEXT  NOT NULL, 
glavna_slika VARCHAR(50) NOT NULL, 
kategorija VARCHAR(25) NOT NULL,
lokacija VARCHAR(50) NOT NULL,
br_kreveta TINYINT  NOT NULL,  
cena REAL  NOT NULL,
id_kategor  INT NOT NULL,
UNIQUE (ime_apartm),
INDEX (id_kategor),
FOREIGN KEY (id_kategor) REFERENCES tip_apartmana(id_kategor)
)TYPE = INNODB;


CREATE TABLE opisi (
id_opisi INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
dodatni_opisi TEXT  NOT NULL,
dodatne_slike VARCHAR(50)  NOT NULL, 
id_apartm  INT NOT NULL,
INDEX (id_apartm),
FOREIGN KEY (id_apartm) REFERENCES apartmani(id_apartm)
) TYPE = INNODB;
[ dragancesu @ 01.09.2007. 13:39 ] @
Mozda moze i ovako ali ako pitas da li je dobro ja bih rekao NIJE.

Stvarno treba sanjati sta da se upise i dobije neki rezultat. Pretpostavljam da ti je za web prezentaciju pa pogledaj neki sajt auto placeva i njihovu pretragu. Lepo se pripremi neka lista vrednosti koja se moze a i ne mora koristiti za pomoc u pretrazi.

Ovako bi inace napravio upit "na jednu rec", ako u pit navedes dve reci rezultat ce biti nista.

[Ovu poruku je menjao dragancesu dana 02.09.2007. u 16:46 GMT+1]
[ duchess @ 15.10.2008. 12:48 ] @
kako ne bih otvarala novu temu, jer je slican problem, pisem ovako... :)

hocu da napravim search tj select upit nad 3 tabele. Ono sto sam uradila izgleda ovako:

Code:

SELECT product.product_id, vendor.vendor_id, manufacturer.manufacturer_id FROM product, vendor, manufacturer WHERE product.product_name LIKE '%$kljucna_rec%' || vendor.vendor_name LIKE '%$kljucna_rec%' || manufacturer.mf_name LIKE '%$kljucna_rec%'


ovaj upit bi trebao da mi nadje $kljucna_rec u okviru te tri tabele i tih polja. Ali, izbaci mi SVE id-ove, kao da taj uslov WHERE nije ni "video".
Jel imao neko iskustva sa komandom LIKE nad vise tabela u okviru jednog select upita?

Hvala unapred.
[ Shinhan @ 16.10.2008. 07:27 ] @
Citat:
duchess: kako ne bih otvarala novu temu, jer je slican problem, pisem ovako... :)

hocu da napravim search tj select upit nad 3 tabele. Ono sto sam uradila izgleda ovako:

Code:

SELECT product.product_id, vendor.vendor_id, manufacturer.manufacturer_id FROM product, vendor, manufacturer WHERE product.product_name LIKE '%$kljucna_rec%' || vendor.vendor_name LIKE '%$kljucna_rec%' || manufacturer.mf_name LIKE '%$kljucna_rec%'


ovaj upit bi trebao da mi nadje $kljucna_rec u okviru te tri tabele i tih polja. Ali, izbaci mi SVE id-ove, kao da taj uslov WHERE nije ni "video".
Jel imao neko iskustva sa komandom LIKE nad vise tabela u okviru jednog select upita?

Hvala unapred.



Nisi JOIN-ovala tabele.
Moja prva preporuka bi bila da koristiš Sphinx ako hoćeš dobre performanse i kvalitetnu pretragu (kao na primer highlight pretraženih reči unutar teksta) ali to nije baš najjednostavnije za implementiranje (moraš pokrenuti search daemon što znači da ne može da se koristi na shared hosting).

Nadam se da ti je baza normalizovana i da imaš indexe na svim ID poljima i FULLTEXT indexe na poljima koja pretražuješ.
Jednostavniji način je da samo ispraviš upit na jedan od sledeća dva načina:
(Ako ti ovaj SQL ne radi, izlistaj sva polja i indexe (eksportuj strukturu pomoću phpmyadmin).
Code:

SELECT product.product_id, vendor.vendor_id, manufacturer.manufacturer_id 
FROM product
 INNER JOIN vendor ON vendor.vendor_id = product.vendor_id
 INNER JOIN manufacturer ON manufacturer.manufacturer_id = vendor.manufacturer_id
WHERE product.product_name LIKE '%$kljucna_rec%' 
 OR vendor.vendor_name LIKE '%$kljucna_rec%' 
 OR manufacturer.mf_name LIKE '%$kljucna_rec%'


Druga varijanta pomoću MySQL fulltext search:
Code:

SELECT product.product_id, vendor.vendor_id, manufacturer.manufacturer_id 
FROM product
 INNER JOIN vendor ON vendor.vendor_id = product.vendor_id
 INNER JOIN manufacturer ON manufacturer.manufacturer_id = vendor.manufacturer_id
WHERE MATCH (product.product_name, vendor.vendor_name, manufacturer.mf_name)
AGAINST ('%$kljucna_rec%');