Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wyszukiwanie słów kluczowych PRZYSPIESZENIE ZAPYTANIA
grzegorz-gg
post 13.08.2008, 17:49:37
Post #1





Grupa: Zarejestrowani
Postów: 94
Pomógł: 0
Dołączył: 25.12.2004

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


Witam,

w jaki sposób napisać zapytanie aby wyszukiwało listę artykułów które maja określone słowa kluczowe wpisane przez użytkownika

np. po wpisaniu słów kluczowych 'a', 'b', 'c'
zostały wyświetlone artykuły o nazwie: artykul1 i artykul3

poniżej przedstawiam tabele z bazie danych

artykul (Zawiera artykuły)

  1. +------+------------+
  2. |  ID  |   nazwa    |
  3. +------+------------+
  4. |   1  |  artykul1  |
  5. |   2  |  artykul2  |
  6. |   3  |  artykul3  |
  7. +------+------------+


keywords ( wszystkie możliwe słowa kluczowe )
  1. +------+-----------+
  2. |  ID  |  keyword  |
  3. +------+-----------+
  4. |   1  |     a     |
  5. |   2  |     b     |
  6. |   3  |     c     |
  7. +------+-----------+


tabela_keywords ( przypisanie słów kluczowych do elementów tabeli artykul )
  1. +-------------+---------------+
  2. |  ID_artykul |  ID_keywords  |
  3. +-------------+---------------+
  4. |      1      |       1       |
  5. |      1      |       2       |
  6. |      1      |       3       |
  7. |      2      |       3       |
  8. |      3      |       1       |
  9. |      3      |       2       |
  10. |      3      |       3       |
  11. +-------------+---------------+


Za pomoc z góry dziękuje.
Pozdrawiam

Ten post edytował grzegorz-gg 16.08.2008, 18:52:27
Go to the top of the page
+Quote Post
Kicok
post 13.08.2008, 21:52:49
Post #2





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Musisz wyszukiwać artykuły, które mają odpowiednie słowa kluczowe:
  1. WHERE keywords IN ( 'a', 'b', 'c' )

oraz odpowiednią ich ilość:
  1. HAVING COUNT( ID ) = 3

dzięki czemu pobrane zostaną tylko te artykuły, które mają wszystkie wymienione tagi.


Do łączenia tabel używasz LEFT JOIN. Pokaż co do tej pory wymyśliłeś to pokombinujemy.


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
grzegorz-gg
post 16.08.2008, 19:05:09
Post #3





Grupa: Zarejestrowani
Postów: 94
Pomógł: 0
Dołączył: 25.12.2004

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


Witam ponownie,

wykonałem takie zapytanie według wskazówek teraz mój problem polega na tym w jaki sposób zmodyfikować to zapytanie aby przyspieszyć jego wykonanie na dużej ilości rekordów ok. 1000000 jakich table i typów kolumn użyć?

Za pomoc z góry dziękuję.

  1. SELECT A.artykul_id, A.artykul_title
  2. FROM keywords K, artykul A
  3. JOIN tabela_keywords TK ON A.artykul_id = TK.artykul_id
  4. WHERE K.keywords_name IN ('a', 'b', 'c') AND TK.keywords_id = K.keywords_id
  5. GROUP BY A.artykul_id
  6. HAVING COUNT(A.artykul_id) = 3
  7. ORDER BY A.artykul_id ASC LIMIT 0, 30


Ten post edytował grzegorz-gg 16.08.2008, 19:07:14
Go to the top of the page
+Quote Post
phpion
post 16.08.2008, 20:20:06
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Masz założony index na keywords_name?
Go to the top of the page
+Quote Post
grzegorz-gg
post 16.08.2008, 23:10:18
Post #5





Grupa: Zarejestrowani
Postów: 94
Pomógł: 0
Dołączył: 25.12.2004

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


To też zrobiłem ale i tak wykonuje się około 4 sek.

Wydaje mi się że trzeba by połączyć inaczej tabele.

I takiego typu tabel są korzystniejsze do szybkiego wyszukiwania?
Go to the top of the page
+Quote Post
phpion
post 17.08.2008, 11:14:24
Post #6





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Wykonaj EXPLAINa dla tego zapytania i wklej tu wynik:
  1. EXPLAIN SELECT A.artykul_id, A.artykul_title
  2. FROM keywords K, artykul A
  3. JOIN tabela_keywords TK ON A.artykul_id = TK.artykul_id
  4. WHERE K.keywords_name IN ('a', 'b', 'c') AND TK.keywords_id = K.keywords_id
  5. GROUP BY A.artykul_id
  6. HAVING COUNT(A.artykul_id) = 3
  7. ORDER BY A.artykul_id ASC LIMIT 0, 30


i spróbuj zamienić miejscami warunki, czyli:
  1. WHERE TK.keywords_id = K.keywords_id AND K.keywords_name IN ('a', 'b', 'c')


Ten post edytował phpion 17.08.2008, 11:15:39
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 16.07.2025 - 13:34