-
Interogare baza de date
Salut,
am si eu o problema cu interogarea unui tabel dintr-o baza de date, am vazut ca sunt cunoscatori prin zona si m-am gandit ca poate ma ajuta si pe mine cineva!
Am un tabel intr-o baza de date care contine date sumare despre articole printre care si metakeyword-urile aferente articolului, fiecare articol are keyword-uri diferite dar la unele se mai si repeta; sa zicem ca primul articol are 3 keyword-uri separate prin virgula "aunturi bmw, bmw 320d, bmw diesel" iar cel de-al doilea "anunturi bmw, bmw 318i, bmw benzina", acum vine si intrebarea mea, cum ar trebui sa arate query-ul care face trimitere catre coloana respectiva din baza de date pentru a-mi intoarce numai valorile unice "anunturi bmw, bmw 320d, bmw 318i, ....."?
Orice idee este bine venita , ms anticipat!
-
Pai rezultatele le bagi intr-un array si apoi cu array_unique extragi valorile distincte.
-
Salutare,
O solutie simpla ar fi:
Cod PHP:
$keywords = array();
$result = mysql_query("SELECT keywords FROM tabel");
while($row = mysql_fetch_object($result)){
$kwds = explode(',',$row->keywords);
if(is_array($kwds)){
foreach($kwds as $k){
$keywords[] = trim($k);
}
}
else{
$keywords[] = $kwds;
}
}
$keywords = array_unique($keywords);
Ma rog... daca e vorba de un singur articol atunci mai pui si "WHERE x = y". Codul ce l-am scris mai sus iti va reda toate cuvintele cheie unice din tabela si poti sa renunti la bucla while. (ex: $row = mysql_fetch_object($result)); Daca nu te descurci da un reply sau da mai multe detalii. Ce am scris e un fel de tag cloud.
Pentru a face direct pe query iti trebuie o procedura stocata.
-
Pai fiecare inregistrare (rand din tabel) corespunde unui articol, deci nu inteleg ce vrei sa zici..
Sau vrei sa faci ceva gen Tag Clod, si sa extragi toate keywordurile si sa elimini pe cele duplicat?
Edit: Daca da, solutiile s-au dat mai sus, cu adaugare intr-un array si apoi cu array_unique.
-
ms mult tuturor pentru raspunsurile prompte!
imi dare rau dar sunt cam "noob" motiv pentru care raspunsul destul de detaliat dat de Gabriel nu mi-a rezolvat problema, iata de ce revin cu mai multe detalii.
Folosesc joomla pentru site si am urmatorul query:
Cod PHP:
$db = &JFactory::getDBO();
$db->setQuery($query);
$query = " SELECT metakey FROM #__sobi2_item WHERE published = 1 ";
$db->setQuery($query);
$column= $db->loadResultArray();
print_r($column);
acesta imi intoarce urmatoarele rezultate:
Cod:
Array ( [0] => aunturi bmw, bmw 320d, bmw diesel [1] => anunturi bmw, bmw 318i, bmw benzina )
pana aici toate bune si frumoase, de aici mai departe nu mai reusesc sa iau valorile din Array si sa le elimin pe cele duplicate .
@netul, da vreau ceva de gen Tag Clod!
-
daca grupezi toate rezultatele intr-unul singur, lucrurile se simplifica un pic:
interogarea ta s-ar schimba in "SELECT GROUP_CONCAT(metakey) AS cuvinteCheie FROM #__sobi2_item WHERE published = 1"
restul (pot fi grupate toate intr-un singur rand de cod, dar asa e mai pe citibil):
Cod:
$cuvinteCheie=explode(',',$column);
$cuvinteCheie=array_map('trim',$cuvinteCheie);
$cuvinteCheie=array_unique($cuvinteCheie);
daca nu doresti sa schimbi interogarea, poti face asa:
Cod:
$cuvinteCheie=implode(',',$column);
$cuvinteCheie=explode(',',$cuvinteCheie);
$cuvinteCheie=array_map('trim',$cuvinteCheie);
$cuvinteCheie=array_unique($cuvinteCheie);
am presupus ca $column este array si contine intotdeauna cel putin un element... ar fi bine sa verifici intai...
-
@Cornelius: Exact acelasi rezultat ar fi trebuit sa scoata si interogarea care am scris-o.
Pune asa acolo:
Cod PHP:
$db = &JFactory::getDBO();
$db->setQuery($query);
$query = " SELECT metakey FROM #__sobi2_item WHERE published = 1 ";
$db->setQuery($query);
$column= $db->loadResultArray();
//$column = array( 0 => 'anunturi bmw, bmw 320d, bmw diesel', 1 => 'anunturi bmw, bmw 318i, bmw benzina');
foreach($column as $key => $kwds){
$kwds = explode(',',$kwds);
if(is_array($kwds)){
foreach($kwds as $k){
$keywords[] = trim($k);
}
}
else{
$keywords[] = $kwds;
}
}
//keyworduri unice
$unique_keywords = array_unique($keywords);
print_r($keywords);
//@return: Array ( [0] => aunturi bmw [1] => bmw 320d [2] => bmw diesel [3] => anunturi bmw [4] => bmw 318i [5] => bmw benzina )
//pentru tag cloud
//unde valoarea = numarul de cuvinte gasite
$tags = array_count_values($keywords);
print_r($tags);
//@return: Array ( [anunturi bmw] => 2 [bmw 320d] => 1 [bmw diesel] => 1 [bmw 318i] => 1 [bmw benzina] => 1 )
-
ms mult celor care au postat, am rezolvat problema si dupa cum spune si @Gabriel acelasi rezultat scotea si prima varianta data de el numai ca nu o vedeam de "nas" !