Lejto
24.05.2010, 16:12:51
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
24.05.2010, 16:19:15
SELECT DISTINCT ...
Lejto
24.05.2010, 16:21:19
ale to wyświetli mi pojedyncze rekordy a chyba nie wywali numerów sezonów itp nie?
tehaha
24.05.2010, 16:26:09
a jaką masz strukturę tabeli? DISTINCT zwraca wyniki bez powtarzania się
Lejto
24.05.2010, 16:34:19
struktura
CREATE TABLE IF NOT EXISTS `videos` (
`videos_id` int(11) NOT NULL AUTO_INCREMENT,
`last_viev` datetime NOT NULL,
`views` int(11) NOT NULL,
`rate` int(11) NOT NULL,
`year` int(11) NOT NULL,
`data` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`description` text NOT NULL,
`video` text NOT NULL,
`code` text NOT NULL,
`xfields` text NOT NULL,
`cover` text,
`title` varchar(255) NOT NULL DEFAULT '',
`flag` text NOT NULL,
`type` int(11) NOT NULL,
`assessments` int(11) NOT NULL,
`added` int(11) NOT NULL,
PRIMARY KEY (`videos_id`),
KEY `date` (`data`),
FULLTEXT KEY `short_story` (`description`,`video`,`xfields`,`title`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=12922 ;
matix
24.05.2010, 16:35:43
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
24.05.2010, 17:17:20
Do rozdzielenia tytułu od reszty możesz również po pobraniu danych z bazy użyć funkcji
explode()
Lejto
24.05.2010, 18:05:41
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
24.05.2010, 19:06:15
no jeżeli jest to możliwe to tak, najlepiej gdybyś miał oddzielne kolumny dla id serii, sezonu, odcinka
Lejto
24.05.2010, 19:12:00
no właśnie, ale nie mam :/
mogę to jakoś podzielić w php i dodać (jakie wyrażenie)?
tehaha
24.05.2010, 19:20:01
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
25.05.2010, 07:38:56
wziąłem się jednak za explode
zrobiłem tak
$sql = $this->sql->query('SELECT videos_id,title FROM videos where type = 1');
while($row = $sql->fetch_array())
{
{
$s = $this->sql->query('
update `videos` set `sezon` = "'.$odcinek[0].'", `odcinek` = "'.$odcinek[1].'" where `videos_id` = "'.$row[videos_id].'"')
or
die($this->sql->errno().' '.$this->sql->error()); }
}
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
25.05.2010, 18:56:46
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.