Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Podobne artykuły - wyszukiwanie
Forum PHP.pl > Forum > Przedszkole
Lethys
Witam,

Piszę stronę gdzie będę publikował artykuły. Chciałbym żeby na pasku bocznym pokazywało podobne tematycznie artykuły.

Wymyśliłem to sobie tak że w tabeli artykułów będą powiedzmy miejsca na 3 słowa kluczowe key,key2,key3

W przypadku gdy jedno ze słów kluczowych będzie takie samo jak ma inny artykuł z bazy to pokaże link do tego arykułu.


  1. $name = mysql_fetch_array(mysql_query("select * from articles where name='$name'"));
  2.  
  3.  
  4. $keywords = mysql_query("select * from articles where $nazwa[key]=$nazwa[key] or $nazwa[key2]=$nazwa[key2] or $nazwa[key3]=$nazwa[key3] order by uu desc limit 5");
  5. while ($top = mysql_fetch_array($keywords)) {
  6. print "<a href=\"#\" class=\"left_menu\">$name[title]</a><br />";
  7. }
  8. ?>



Po:

1. Pewnie nie można w ten sposób w zapytaniu żądać żeby nam porównało 3 słowa kluczowe

2. Jak je sprawdzić czy są takie same ? Przyrównanie do siebie nie jest dobrym pomysłem ale nie wiem do czego przyrównać.

$nazwa[key] -> pokaże nam słowo kluczowe obecnego artykułu, ale do czego to przyrównać żeby sprawdziło nam bazę czy są podobne słowa kluczowe?
AlexDeLarge
Zrób sobie tabelkę keywords
Kod
CREATE TABLE keywords (
  kid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  word VARCHAR(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_polish_ci';


Do tego tabelkę keywords_articles:
Kod
CREATE TABLE keywords_articles (
  kid INT NOT NULL REFERENCES(keywords.kid),
  aid INT NOT NULL REFERENCES(articles.aid)
) ENGINE=InnoDB DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_polish_ci';


I pobieraj powiązane artykuły zapytaniem:
Kod
SELECT articles.*
FROM articles JOIN keywords_articles USING(aid)
WHERE keywords_articles.kid IN (
  SELECT keywords.kid
  FROM keywords JOIN keywords_articles USING(kid)
  WHERE keywords_articles.aid = $id_artykulu
)


I możesz mieć więcej niż 3 słowa kluczowe, a zapytania możesz uprościć wedle własnego widzimisię.
Lethys
Generalnie Twój pomysł mi się podoba i jest znacznie praktyczniejszy ale oczywiście nie mogło się obyć bez problemów sad.gif

Kiedy staram się stworzyć tabele pojawia się błąd


Cytat
MySQL zwrócił komunikat: Dokumentacja
#1064 - Something is wrong in your syntax obok '(keywords.kid),
aid INT NOT NULL REFERENCES(articles.aid)
)' w linii 2


A poźniej jak mam wyświetlić dane, w ten sposób?


  1.  
  2. $keywords = mysql_query("SELECT articles.*
  3. FROM articles JOIN keywords_articles USING(aid)
  4. WHERE keywords_articles.kid IN (
  5. SELECT keywords.kid
  6. FROM keywords JOIN keywords_articles USING(kid)
  7. WHERE keywords_articles.aid = $id_artykulu
  8. ) order by uu desc limit 5");
  9. while ($top = mysql_fetch_array($keywords)) {
  10. print "<a href=\"#\" class=\"left_menu\">$name[title]</a><br />";
  11. }


Jak nie to w jaki sposób? Nigdy nie korzystałem z łączenia tabel.
AlexDeLarge
Oczywiście zrobiłem błąd w składni w deklaracji drugiej tabeli. Prawidłowa wersja:
  1. CREATE TABLE keywords_articles (
  2. kid INT NOT NULL,
  3. aid INT NOT NULL,
  4. FOREIGN KEY kid REFERENCES keywords(kid) ON DELETE CASCADE,
  5. FOREIGN KEY aid REFERENCES articles(aid) ON DELETE CASCADE
  6. ) ENGINE=InnoDB DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_polish_ci';


Drobną zmianę polecam również w tabeli pierwszej:

  1. CREATE TABLE keywords (
  2. kid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  3. word VARCHAR(255) NOT NULL
  4. ) ENGINE=InnoDB DEFAULT CHARACTER SET 'utf8' DEFAULT COLLATE 'utf8_polish_ci';


Słowem wyjaśnienia:
1. ENGINE=InnoDB - tutaj w MySQL możemy korzystać z dobrodziejstw kluczy obcych, tzn. :
a) przed dodaniem rekordu do keywords_articles silnik sam sprawdzi, czy istnieją rekordy o adekwatnym kid i aid (czy jak tam się nazywa ID w tabeli articles)
b) podczas usuwania rekordu z articles, albo keywords zostanie usunięty również odpowiadający mu rekord w keywords_articles (ON DELETE CASCADE)
2. O kluczach obcych poczytać możesz tutaj: http://dev.mysql.com/doc/refman/5.5/en/inn...onstraints.html
3. Tym długim zapytaniem które podałem znajdziesz ID i inne dane artykułów powiązanych (tzn. takich, które są oznaczone tymi samymi tagami). Aby znaleźć słowa kluczowe przypisane do aktualnie wyświetlanego artykułu wykonujesz zapytanie ($aid to właśnie ID aktualnie wyświetlanego artykułu):
  1. SELECT keywords.*
  2. FROM keywords JOIN keywords_articles ON keywords.kid = keywords_articles.kid
  3. WHERE keywords_articles.aid = $aid;


Chyba tyle. Oczywiście wszystko nietestowane, z głowy, więc nie ręczę i możliwe, że będziesz musiał posiedzieć chwilę.
Zdrówka życzę.
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.