Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] szukajka ? - nurtujące zapytanie do bazy
Forum PHP.pl > Forum > Przedszkole
stroju
Nie do końca wiem jak się za to zabrać, więc opiszę do i jak

mam 2 tabele z bazie danych, np katalog i drugą kategorie. w pierwszej znajdują sie produkty, czyli id, nazwa itd, w drugiej znajdują sie natomiast kategorie, czyli też mamy id i nazwę

jeden produkt może należeć do więcej niż jednej kategorii, dlatego też mam 2 rozwiązania
1) zrobic w tabeli katalog pole i tam oddzielając przecinkami podawać id kategorii i przy odczycie wiadomo expolode i robimy listę
2) zrobić 3 tabele łączącą obie tak że mamy podane id kategorii i id produktu, zatem można w ten sposób dodać kilka kategorii do produktu

ogólnie prosta sprawa

jednak pojawia się problem gdy chcę np zrobić wyszukiwarkę w której np zaznaczam 3 kategorię do których ma należeć dany produkt. sposobem nr 1 można by użyć like jednak gdy id jest np dwucyfrowe to jak pytam o id 1 to pokaże się też 10, 11 ... i tak dalej, co do sposobu nr 2 właśnie nie mogłem nic konkretnego wymyślić

pytanie więc jak to zrobić, bo zdaję sobie sprawę że problem ten zapewne jest banalny smile.gif
Fifi209
Zrób tabelę, którą wykorzystasz do złączenia - jak sam napisałeś. Odpowiednie zapytanie i będzie ok.

Pokaż te tabele, pokaż jakie pola, ich typ i długość.
stroju
nie mam jeszcze tych tabel, na razie to ja myślę jak to wykonać, jednak no id będą zapewne w int długość 9, name varchar do 255, połączenie to będzie tabela z 2 kolumnami obie int 9 w których będą numery id łączące id produktu z id kategorii, prosta konstrukcja, i koncepcji brak jak napisać zapytanie aby pokazało produkt który należy do 2 kategorii jednocześnie, a nie ze należy do jednej lub do drugiej.
bastard13
Tak mniej więcej mi się widzą te tabele:
  1. CREATE TABLE produkty
  2. ( id_p int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  3. nazwa char(100) NOT NULL
  4. )type=innodb;
  5. CREATE TABLE katalogi
  6. ( id_k int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  7. nazwa char(100) NOT NULL
  8. )type=innodb;
  9. CREATE TABLE co_gdzie
  10. ( id_p int UNSIGNED NOT NULL,
  11. id_k int UNSIGNED NOT NULL,
  12. PRIMARY KEY(id_p,id_k),
  13. FOREIGN KEY (id_k) REFERENCES katalogi(id_k) ON DELETE cascade,
  14. FOREIGN KEY (id_p) REFERENCES produkty(id_p) ON DELETE cascade
  15. )type=innodb;

,a co do zapytania to chyba:
  1. SELECT p.nazwa
  2. FROM produkty AS p, katalogi AS k, co_gdzie AS c
  3. WHERE p.id_p=c.id_p AND k.id_k=c.id_k AND k.nazwa IN('nazwa pierwszego katalogu','nazwa drugiego katalogu') GROUP BY p.nazwa;

Jeśli chodzi o zapytanie to nie jestem do końca pewien, bo pisane na szybko, ale powinno działać.
stroju
dokładnie o to chodziło, dobrze zrobione, wielkie dzięki za pomoc smile.gif

jednak jak tak chwilę szperałem to zobaczyłem że wyszukuję tych rekordów które są wymienione, a nie tych które należą do obu..
bastard13
Faktycznie, moja wina:)
Spróbuj tego:
  1. SELECT p.nazwa
  2. FROM produkty AS p, katalogi AS k, katalogi AS kat, co_gdzie AS c
  3. WHERE p.id_p=c.id_p AND k.id_k=c.id_k AND kat.id_k=c.id_k
  4. AND k.nazwa='nazwa pierwszego katalogu' AND kat.nazwa='nazwa drugiego katalogu'
  5. GROUP BY p.nazwa;

Powinno być lepiej.
stroju
to rozwiązanie niestety nie działa w ogóle, zamysł podobny do mojego jak wcześnie próbowałem ale ten również nie działa

istnieje w ogóle w mysql tego typu dyrektywa aby zrobić takie zapytanie?? czy trzeba kombinować questionmark.gif
bastard13
Może tak?
  1. SELECT p.nazwa
  2. FROM produkty AS p, katalogi AS k, katalogi AS kat, co_gdzie AS c
  3. WHERE p.id_p=c.id_p AND k.id_k=c.id_k AND kat.id_k=c.id_k
  4. AND (k.nazwa,kat.nazwa)= ALL ('nazwa1','nazwa2')
  5. GROUP BY p.nazwa;

Albo może coś z operatorem EXISTS:
  1. SELECT p.nazwa
  2. FROM produkty AS p
  3. WHERE EXISTS
  4. (SELECT * FROM katalogi AS k, produkty AS p, co_gdzie AS c
  5. WHERE k.id_k=c.id_k AND p.id_p=c.id_p
  6. AND k.nazwa='nazwa1')
  7. AND EXISTS
  8. (SELECT * FROM katalogi AS k, produkty AS p, co_gdzie AS c
  9. WHERE k.id_k=c.id_k AND p.id_p=c.id_p
  10. AND k.nazwa='nazwa2')
  11. GROUP BY p.nazwa;
stroju
zwraca błąd w bazie przy zapytaniu, niestety nadal nic, myślę że trzeba by to rozpisać w php w pętlach i na podstawie pętli coś wykombinować.. bo z tym zapytaniem coś nie chce wyjść.. lub jeszcze w inny sposób konstruować tabele, może by pomogło, będę kombinować

ktoś coś jeszcze może zna??
bastard13
Stworzyłem sobie w tą tabelę i okazało się to naprawdę banalne, zresztą tak jest najczęściej:)
Tutaj masz zapytanie, działa na 100 %
  1. SELECT p.nazwa
  2. FROM co_gdzie AS c, katalogi AS k,
  3. co_gdzie AS cg, katalogi AS kat,
  4. produkty AS p
  5. WHERE p.id_p=c.id_p AND k.id_k=c.id_k AND k.nazwa='nazwa1' AND
  6. p.id_p=cg.id_p AND kat.id_k=cg.id_k AND kat.nazwa='nazwa2';

Pozdrawiam.
stroju
wczoraj siedziałem z tym i tak bawiąc się doszedłem do podobnego rezultatu z bardzo podobnym wynikiem, także dzięki za pomoc oczywiście sporo mi pomogły Twoje podpowiedzi smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.