Mareczko
12.12.2009, 12:52:58
Witam
Zamierzam zrobić sobie tagi na mojej stronie. Chciałbym się Was poradzić jak to rozwiązać. Mam 1 tabele z wszystkimi gdzie w 1 polu mam wpisywane tagi w postaci: tag1, tag2, tag3 itd. No i teraz zastanawiam się co dalej zrobić żeby później wyświetlić je w postaci chmury tagów na stronie.
Pozdrawiam
darko
12.12.2009, 13:13:42
explode na ", " i foreach na tablicy
Mareczko
12.12.2009, 13:18:55
Dzięki, a jak pozbyć się dubli ? bo kilka wpisów może mieć takie same tagi wpisane.
darko
12.12.2009, 13:20:39
array_unique na utworzonej tablicy
Mareczko
12.12.2009, 15:33:47
Dzięki wielkie jeszcze raz. Już prawie sobie poradziłem
kod wygląda roboczo tak:
<?php
$keywords="tag1, tag1, tag2,tag3";
foreach($keywords as $i => $tag){
}
?>
Teraz nie wiem gdzie tu upchać trim() bo 2 pierwsze tagi są takie same, a przez spację przed 2 wyświetlane są one jako 2 różne.
darko
14.12.2009, 03:19:51
Jeśli jako separator masz przecinek i spację pomiędzy poszczególnymi elementami, to - jak już napisałem w pierwszym poście - zrób explode na przecinku i spacji (", ")
piotrooo89
14.12.2009, 07:14:01
średnio elegancko to jest. ja polecam
explode z samym przecinkiem (bez spacji) i później
trim na każdym elemencie tablicy.
Mareczko
14.12.2009, 13:38:24
Problem rozwiązałem tak:
Inaczej raczej nie da się bo te tagi mogą być różne - ze spacją na początku ale i bez.
Mam teraz do Was trochę inne pytanie.
Moja koncepcja tagów raczej się nie sprawdzi - nie bardzo wiem jak rozwiązać to. Czy stworzyć nową tabelę z samymi tagami ? każdy rekord byłby innym tagiem - czy będzie to dobre rozwiązanie biorąc pod uwagę, że tych tagów może być znaczna ilość?
piotrooo89
14.12.2009, 13:45:35
Cytat(Mareczko @ 14.12.2009, 13:38:24 )

tych tagów może być znaczna ilość?
ile dla Ciebie to znaczna ilość? 100 000, 200 000, 1 000 000? bo jeśli tak to swobodnie możesz robić dla każdego tagi nowy rekord.
Mareczko
14.12.2009, 13:50:56
Myślę, że po jakimś czasie było by tego w setkach tysięcy. Przy takiej ilości rekordów jak najlepiej losować powiedzmy 5 rekordów ? ORDER BY RAND() ?
darko
14.12.2009, 13:53:06
order by rand() limit 5
?
Mareczko
14.12.2009, 13:54:12
Tak wiem, tylko chodzi mi o to czy w tabeli będzie 500 000 rekordów to order by rand() limit 5 będzie optymalne.
piotrooo89
14.12.2009, 13:55:31
na pewno 100% optymalności nie osiągniesz, lecz jest to powiedzmy dobre rozwiązanie.
darko
14.12.2009, 14:04:49
Będziesz miał chmurę tagów złożoną z 1000 000 pozycji? Może masz na myśli kilkaset stron, to wtedy dla każdego taga dajesz klucz obcy dla odpowiedniej strony i masz już jakoś znormalizowaną bazę.
Mareczko
14.12.2009, 14:09:53
Cytat(darko @ 14.12.2009, 14:04:49 )

Będziesz miał chmurę tagów złożoną z 1000 000 pozycji? Może masz na myśli kilkaset stron, to wtedy dla każdego taga dajesz klucz obcy dla odpowiedniej strony i masz już jakoś znormalizowaną bazę.
Nie bardzo rozumie o czym piszesz.
W chmurze tagów będę wyświetlał powiedzmy 5 losowych tagów z 500 000 zapisanych w bazie.
piotrooo89
14.12.2009, 14:11:02
możesz pokazywać 5 najczęściej używanych tagów.
phpion
14.12.2009, 14:11:19
Cytat(Mareczko @ 14.12.2009, 13:54:12 )

Tak wiem, tylko chodzi mi o to czy w tabeli będzie 500 000 rekordów to order by rand() limit 5 będzie optymalne.
Słuszna uwaga. Zdecydowanie lepiej (szczególnie w MyISAM) zrobić to trochę na okrętkę. Najpierw pobrać łączną liczbę rekordów do zmiennej w PHP (poprzez SELECT COUNT(*) FROM tabela - na MyISAM śmignie szybciutko). Potem w PHP wylosować liczbę od 0 do liczby rekordów z bazy pomniejszonej o liczbę rekordów do wyświetlenia (w Twoim przypadku 5) czyli $start = mt_rand(0, $count - 5). Dane wybrać zapytaniem SELECT ... LIMIT x,y gdzie x to wylosowana wcześniej liczba ($start), a y to narzucony limit (5). Niby 2 zapytania + losowanie w PHP, ale śmignie szybciej na dużej liczbie rekordów niż ORDER BY RAND() LIMIT 5.
darko
14.12.2009, 14:13:13
Można tak, jak pisałeś śmiało użyć order by rand() limit 5. Nie znam niczego bardziej optymalnego w tym przypadku (co nie znaczy, że to nie istnieje).
phpion - też o tym myślałem, ale zabrakło mi limit x,y Chciałem wyciągnąć dane po idkach, tyle że to działałoby dopiero w przypadku, jeśli byłaby zachowana kolejność idków.
piotrooo89
14.12.2009, 14:17:06
pion podał fajną rzecz. sprawdziłem i na postgresie order by random() na tabeli która ma dokładnie 504 432 rekordy i nie było jakiejś tragedii fajnie szybko się wyświetliło.
Mareczko
18.12.2009, 11:25:48
Dzięki wszystkim, mam nadzieje, że już sobie poradzę:)
Mam szybkie pytanie,
jak pozbyc sie dubli przy koncowym wyswietlaniu?
W tej chwili duble sa przesiewane tylko z konkretnego rekordu a jak to zamienic zeby usuwane byly biorac pod uwage wszystkie wyciagniete rekordy ?
$sql = '
SELECT item_keywords
FROM items
';
if($row['item_keywords']){
$keywords=$row['item_keywords'];
foreach($keywords as $i => $tag){
}
}
}
Nikt nie pomoże ?
piotrooo89
18.12.2009, 15:55:03
distinct?
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.