Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]/[mysql] baza seriali
Forum PHP.pl > Forum > PHP
Lejto
Mam bazę seriali gdzie np. jeden rekord wygląda tak Brygada ratunkowa Sezon 6 Odcinek 14 każdy sezon ma swoje ID. Chcę wyciągnąć z bazy same tytuły zeby się nic nie powtarzało np. Brygada ratunkowa, Lost, CSI itp. Jak to zrobić?
Sekwer
SELECT DISTINCT ...
Lejto
ale to wyświetli mi pojedyncze rekordy a chyba nie wywali numerów sezonów itp nie?
tehaha
a jaką masz strukturę tabeli? DISTINCT zwraca wyniki bez powtarzania się
Lejto
struktura
  1.  
  2. CREATE TABLE IF NOT EXISTS `videos` (
  3. `videos_id` int(11) NOT NULL AUTO_INCREMENT,
  4. `last_viev` datetime NOT NULL,
  5. `views` int(11) NOT NULL,
  6. `rate` int(11) NOT NULL,
  7. `year` int(11) NOT NULL,
  8. `data` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  9. `description` text NOT NULL,
  10. `video` text NOT NULL,
  11. `code` text NOT NULL,
  12. `xfields` text NOT NULL,
  13. `cover` text,
  14. `title` varchar(255) NOT NULL DEFAULT '',
  15. `flag` text NOT NULL,
  16. `type` int(11) NOT NULL,
  17. `assessments` int(11) NOT NULL,
  18. `added` int(11) NOT NULL,
  19. PRIMARY KEY (`videos_id`),
  20. KEY `date` (`data`),
  21. FULLTEXT KEY `short_story` (`description`,`video`,`xfields`,`title`)
  22. ) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=12922 ;
  23.  

matix
Zaimplementuj sobie funkcję SQL w oparciu o algorytm porównywania Levenshtein'a. W internecie dużo jest na ten temat.
Drugą metodą jaka mi się nasuwa na myśl jest skorzystanie z pełnotekstowego wyszukiwania, lub Lucene/Sphinx.

// edit
Po strukturze tabeli wnioskuję, że korzystasz z MyISAM, tak więc nie ma problemu z użyciem zwykłego pełnotekstowego wyszukiwania w MySQL-u. I nie zapomnij o cache-u całości na sam koniec.
GreenGo
Do rozdzielenia tytułu od reszty możesz również po pobraniu danych z bazy użyć funkcji explode()
Lejto
zobaczę z algorytmem Levenshtein'a
jak wykorzystać pełnotekstowe wyszukiwanie?
explode chyba nie da rady, bo co jak tytuł będzie inaczej ułożony
a wyrażeniami nie da rady tego zrobić?

czy może muszę mieć jeszcze jedną tabele z samymi tytułami?
tehaha
no jeżeli jest to możliwe to tak, najlepiej gdybyś miał oddzielne kolumny dla id serii, sezonu, odcinka
Lejto
no właśnie, ale nie mam :/
mogę to jakoś podzielić w php i dodać (jakie wyrażenie)?
tehaha
wydaje mi się, że wykonanie wyrażenia na każdym pobranym rekordzie i jeszcze dalsze przetwarzanie tego będzie bardzo nie efektywne, może dorób te dodatkowe kolumny i napisz skrypt, który wyrażeniami regularnymi po oddzielaj tytuły od numerów odcinka i sezonów i porozmieszcza to w odpowiednich kolumnach, bo inaczej to nie ma sensu
Lejto
wziąłem się jednak za explode
zrobiłem tak
  1. $sql = $this->sql->query('SELECT videos_id,title FROM videos where type = 1');
  2. while($row = $sql->fetch_array())
  3. {
  4. $tytul = strtolower($row[title]);
  5. $sezon = explode('sezon',$tytul);
  6. $odcinek = explode(' odcinek', strtolower($sezon[1]));
  7.  
  8. if(!empty($odcinek[0]) and !empty($odcinek[1]))
  9. {
  10. preg_match_all("/(\d+)/", $odcinek[1], $wynik);
  11. echo $wynik[0];
  12.  
  13. echo '<br>';
  14. $s = $this->sql->query('
  15. update `videos` set `sezon` = "'.$odcinek[0].'", `odcinek` = "'.$odcinek[1].'" where `videos_id` = "'.$row[videos_id].'"')
  16. or die($this->sql->errno().' '.$this->sql->error());
  17. }
  18.  
  19.  
  20.  
  21. }

działa, ale w nietkórych polach jeszcze dodaje fragment tytułu więc napisałem wyrazenie zeby wyciągało same liczby, ale z wyrazeniem już nie działa dostaje pustą tablice.


już sobie poradziłem
teraz tylko jak wyświetlić same tytuły, bez sezon, odcinek
matix
Jeśli Twoj serwis się rozwinie to współczuję firmie która będzie Ci to hostować. Dlaczego? Jak będziesz miał kilkaset tysięcy wyników i zrobisz coś takiego co masz napisane (zakładam, że jeśli robisz serwis na takim poziomie to i cache nie będzie...) to serwis Ci długo nie pociągnie.

Poczytaj o tym, co ja Ci napisałem. Explode nie rozwiąże Twojego problemu, bo nie wszystkie tytuły wyglądają tak samo. Potrzebujesz wykorzystać FULLTEXT search przy MyISAM, lub algorytm o którym wspominałem wcześniej.

Schemat działania jest taki, że pobierasz wszystkie rekordy, których podobieństwo jest mniejsze niż określona procentowa ilość (ile dokładnie, nie wiem - sam sprawdź - Ja tylko podaję dobry sposób podejścia do tego problemu..).

Działać i działać to dwie inne sprawy - rób jak chcesz, ale partactwo potrafi zrobić każdy.
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.