Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: nie typowe polaczenie tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
gantel
  1. SELECT
  2. nazwy.id_dok id_n,
  3. nazwy.nazwa,
  4. 60 AS pkt_nazwa,
  5.  
  6. dok_opisy.id_dok id_o,
  7. dok_opisy.opis,
  8. 40 AS pkt_opis
  9.  
  10. FROM nazwy, opisy
  11.  
  12. WHERE nazwy.nazwa LIKE "%'.$szukaj.'%" AND opisy.opis LIKE "%'.$szukaj.'%"


Chodzi o to ze chce pobrac rekordy gdzie

z tabeli 'nazwy' pole 'nazwa' pasuje do zmiennej $szukaj
z tabeli 'opisy' pole 'opis' pasuje do zmiennej $szukaj

Jezeli dodam warunek
nazwy.id_dok=opisy.id_dok

Nie zostana pobrane rekordy ktore:
zawieraja tylko w polu nazwa szukane slowo ale w opisie ich juz nie ma
zawieraja tylko w opisie szukane slowo ale w nazwie ich juz nie ma

Na koniec chce zsumowac pkt_nazwa + pkt_opis w ten sposob i posortowac sumy malejaco:

Jezeli pola nazwa i w opis zawieraja szukane slowo zeby suma wynosila 60 + 40 =100
Jezeli tylko pole nazwa zawiera szukane slowo suma wynosila 60 + 0 = 60
Jezeli tylko pole opis zawiera szukane slowo suma wynosila 0 + 40 = 40

Tak wygladaja tabele

nazwy:

id_dok | nazwa
-------------------------
1 |zielony
2 |czerwony
3 |niebieski
4 |zolty


opisy:

id_dok | opis
-------------------------
1 |kolor zielony jest cieply
2 |to kolor goracy
3 |niebieski jest kolorem zimnym, nie tak jak zielony
4 |zolty to kolor slonecznikow

Zalozmy ze szukamy slowa: 'zielony'


Chce otrzymac taki wynik

id_dok | pkt | nazwa | opis
---------------------------------------------------------------------------
1 | 100 | zielony | kolor zielony jest cieply
3 | 40 | niebieski | niebieski jest kolorem zimnym, nie tak jak zielony


Jak skonstruowac takie zapytanie do mysqla lub wspomoc sie ewentualnie php zeby uzyskiwac takie wyniki
Cezar708
myśle, że takie zapytanie Ci całkowicie wystarczy:
  1. SELECT
  2. nazwy.id_dok id_n,
  3. CASE
  4. WHEN nazwy.nazwa LIKE "%'.$szukaj.'%" AND opisy.opis LIKE "%'.$szukaj.'%" THEN 100
  5. WHEN nazwy.nazwa LIKE "%'.$szukaj.'%" THEN 60
  6. WHEN opisy.opis LIKE "%'.$szukaj.'%" THEN 40
  7. END AS pkt
  8. nazwy.nazwa,
  9. dok_opisy.opis,
  10. FROM nazwy, opisy
  11. WHERE nazwy.nazwa LIKE "%'.$szukaj.'%" AND opisy.opis LIKE "%'.$szukaj.'%"
  12. -- ewentualnie opcjonalnie sortowanie po punktach i nazwie
  13. ORDER BY pkt DESC, nazwy.nazwa


PS: Nie pisałeś nic o silniku, ja sprawdzałem to na PostgreSQL
gantel
Rzeczywiscie to zapytanie jest OK tyle ze proboje teraz dodac jeszcze trzeci warunek tak wyglada moje zapytanie juz konkretnie do tej bazy

  1. SELECT
  2. nazwy.id_dok,
  3. nazwy.nazwa,
  4. nazwy.nazwa_en,
  5. opisy.opis,
  6. sklucze.KEY,
  7. CASE
  8.  
  9. WHEN
  10. nazwy.nazwa LIKE "%'.$szukaj.'%" AND opisy.opis LIKE "%'.$szukaj.'%" AND sklucze.`key`="'.$szukaj.'"
  11. THEN 100
  12.  
  13. WHEN
  14. nazwy.nazwa LIKE "%'.$szukaj.'%" AND sklucze.`key`="'.$szukaj.'"
  15. THEN 80
  16.  
  17. WHEN
  18. nazwy.nazwa LIKE "%'.$szukaj.'%" AND opisy.opis LIKE "%'.$szukaj.'%"
  19. THEN 65
  20.  
  21. WHEN
  22. opisy.opis LIKE "%'.$szukaj.'%" AND sklucze.`key`="'.$szukaj.'"
  23. THEN 55
  24.  
  25. WHEN nazwy.nazwa LIKE "%'.$szukaj.'%" THEN 45
  26. WHEN sklucze.`key`="'.$szukaj.'" THEN 35
  27. WHEN opisy.opis LIKE "%'.$szukaj.'%" THEN 20
  28.  
  29. END AS pkt
  30.  
  31. FROM `!new_dok_nazwy` nazwy,
  32. `!new_dok_opisy` opisy,
  33. `!new_dok_keys` sklucze
  34.  
  35. WHERE (
  36. nazwy.nazwa LIKE "%'.$szukaj.'%" OR opisy.opis LIKE "%'.$szukaj.'%" OR sklucze.`key`="'.$szukaj.'"
  37. ) AND nazwy.id_dok=opisy.id_dok AND nazwy.id_dok=sklucze.id_dok
  38.  
  39.  
  40. GROUP BY id_dok
  41. ORDER BY pkt DESC, nazwy.nazwa


Nie moge uzyskac 100 pkt nie bierze jakby pod uwage w pierwszym warunku THEN tabeli 'sklucze'.
Natomiast gdy slowo wystepuje tylko w 'sklucze' punktuje na 35 pkt

Co moze byc tego przyczyna.
Cezar708
hmm...

jest wiele możliwości... nie wiem co może być nie tak

... może mieć to związek z wielkością liter,

może jeszcze w PHP użyj strtolower()
a w zapytaniu:
  1. SELECT
  2. nazwy.id_dok,
  3. nazwy.nazwa,
  4. nazwy.nazwa_en,
  5. opisy.opis,
  6. sklucze.KEY,
  7. CASE
  8.  
  9. WHEN
  10. LOWER(nazwy.nazwa) LIKE "%'.$szukaj.'%" AND LOWER(opisy.opis) LIKE "%'.$szukaj.'%" AND LOWER(sklucze.`key`)="'.$szukaj.'"
  11. THEN 100
  12.  
  13. WHEN
  14. LOWER(nazwy.nazwa LIKE "%'.$szukaj.'%" AND LOWER(sklucze.`key`="'.$szukaj.'"
  15. THEN 80
  16.  
  17. WHEN
  18. LOWER(nazwy.nazwa) LIKE "%'.$szukaj.'%" AND LOWER(opisy.opis) LIKE "%'.$szukaj.'%"
  19. THEN 65
  20.  
  21. WHEN
  22. LOWER(opisy.opis) LIKE "%'.$szukaj.'%" AND LOWER(sklucze.`key`)="'.$szukaj.'"
  23. THEN 55
  24.  
  25. WHEN LOWER(nazwy.nazwa) LIKE "%'.$szukaj.'%" THEN 45
  26. WHEN LOWER(sklucze.`key`)="'.$szukaj.'" THEN 35
  27. WHEN LOWER(opisy.opis) LIKE "%'.$szukaj.'%" THEN 20
  28.  
  29. END AS pkt
  30.  
  31. FROM `!new_dok_nazwy` nazwy,
  32. `!new_dok_opisy` opisy,
  33. `!new_dok_keys` sklucze
  34. WHERE (
  35. LOWER(nazwy.nazwa) LIKE "%'.$szukaj.'%" OR LOWER(opisy.opis) LIKE "%'.$szukaj.'%" OR LOWER(sklucze.`key`)="'.$szukaj.'"
  36. ) AND nazwy.id_dok=opisy.id_dok AND nazwy.id_dok=sklucze.id_dok
  37.  
  38.  
  39. GROUP BY id_dok
  40. ORDER BY pkt DESC, nazwy.nazwa


ewentualnie użyj ILIKE.
gantel
Litery napewno nie maja znaczenia bo wprowadzam dokladnie takie jak sa w tym polu tabeli o ktora mi sie rozchodzi.
Pytales o silnik: mysql 5

LIKE i tak chce zamienic za chwile na MATCH() AGAINST() i dodac jeszcze do tego wspolczynniki trafnosci wuszukiwania pelnotekstowego
Cezar708
Cytat(gantel @ 22.02.2008, 14:18:44 ) *
Nie moge uzyskac 100 pkt nie bierze jakby pod uwage w pierwszym warunku THEN tabeli 'sklucze'.
Natomiast gdy slowo wystepuje tylko w 'sklucze' punktuje na 35 pkt


a może sklucze bierze pod uwagę, a nie bierze co najmniej jednego z dwóch pierwszych warunków?

potestowałem sobie te zapytanie na mojej bazie, i wszystko mi działa bez problemu 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.