Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> nie typowe polaczenie tabel
gantel
post
Post #1





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 26.04.2003
Skąd: Łańcut

Ostrzeżenie: (0%)
-----


  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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Cezar708
post
Post #2





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
gantel
post
Post #3





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 26.04.2003
Skąd: Łańcut

Ostrzeżenie: (0%)
-----


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.

Ten post edytował gantel 22.02.2008, 14:42:06
Go to the top of the page
+Quote Post
Cezar708
post
Post #4





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
gantel
post
Post #5





Grupa: Zarejestrowani
Postów: 29
Pomógł: 0
Dołączył: 26.04.2003
Skąd: Łańcut

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Cezar708
post
Post #6





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 17:43