Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php]/[mysql] baza seriali, Wyświetlanie samych tytułów
Lejto
post 24.05.2010, 16:12:51
Post #1





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


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ć?


--------------------
Go to the top of the page
+Quote Post
Sekwer
post 24.05.2010, 16:19:15
Post #2





Grupa: Zarejestrowani
Postów: 36
Pomógł: 2
Dołączył: 18.01.2009

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


SELECT DISTINCT ...
Go to the top of the page
+Quote Post
Lejto
post 24.05.2010, 16:21:19
Post #3





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


ale to wyświetli mi pojedyncze rekordy a chyba nie wywali numerów sezonów itp nie?


--------------------
Go to the top of the page
+Quote Post
tehaha
post 24.05.2010, 16:26:09
Post #4





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


a jaką masz strukturę tabeli? DISTINCT zwraca wyniki bez powtarzania się

Ten post edytował tehaha 24.05.2010, 16:27:41
Go to the top of the page
+Quote Post
Lejto
post 24.05.2010, 16:34:19
Post #5





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


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.  



--------------------
Go to the top of the page
+Quote Post
matix
post 24.05.2010, 16:35:43
Post #6





Grupa: Zarejestrowani
Postów: 278
Pomógł: 10
Dołączył: 13.02.2007
Skąd: Rybnik

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


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.

Ten post edytował matix 24.05.2010, 16:37:43


--------------------
Nawet, jeżeli nie jesteś zainteresowany usługami IT ani outsourcingiem, a Twoją pasją jest programowanie - zobacz naszą stronę. Piszemy dużo fajnych use-caseów, jak podchodzimy do tematu programowania dla naszych klientów. A tak na co dzień tworzymy budujemy mvp oraz tworzymy platformę b2b.
Go to the top of the page
+Quote Post
GreenGo
post 24.05.2010, 17:17:20
Post #7





Grupa: Zarejestrowani
Postów: 265
Pomógł: 4
Dołączył: 30.08.2004

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


Do rozdzielenia tytułu od reszty możesz również po pobraniu danych z bazy użyć funkcji explode()
Go to the top of the page
+Quote Post
Lejto
post 24.05.2010, 18:05:41
Post #8





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


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?


--------------------
Go to the top of the page
+Quote Post
tehaha
post 24.05.2010, 19:06:15
Post #9





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


no jeżeli jest to możliwe to tak, najlepiej gdybyś miał oddzielne kolumny dla id serii, sezonu, odcinka
Go to the top of the page
+Quote Post
Lejto
post 24.05.2010, 19:12:00
Post #10





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


no właśnie, ale nie mam :/
mogę to jakoś podzielić w php i dodać (jakie wyrażenie)?


--------------------
Go to the top of the page
+Quote Post
tehaha
post 24.05.2010, 19:20:01
Post #11





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


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
Go to the top of the page
+Quote Post
Lejto
post 25.05.2010, 07:38:56
Post #12





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 48
Dołączył: 23.05.2007

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


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


--------------------
Go to the top of the page
+Quote Post
matix
post 25.05.2010, 18:56:46
Post #13





Grupa: Zarejestrowani
Postów: 278
Pomógł: 10
Dołączył: 13.02.2007
Skąd: Rybnik

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


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.


--------------------
Nawet, jeżeli nie jesteś zainteresowany usługami IT ani outsourcingiem, a Twoją pasją jest programowanie - zobacz naszą stronę. Piszemy dużo fajnych use-caseów, jak podchodzimy do tematu programowania dla naszych klientów. A tak na co dzień tworzymy budujemy mvp oraz tworzymy platformę b2b.
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: 19.07.2025 - 09:58