Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyszukiwanie słów kluczowych PRZYSPIESZENIE ZAPYTANIA
Forum PHP.pl > Forum > Bazy danych
grzegorz-gg
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
Kicok
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.
grzegorz-gg
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
phpion
Masz założony index na keywords_name?
grzegorz-gg
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?
phpion
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')
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.