mySQL query, help pliz

Ovako mi izgleda query koji radi:

$query="SELECT medijID,autor FROM medij where medijID in ( SELECT medijID FROM medij_svojstva WHERE rijec REGEXP 'patern*')"; 

E sad, mene zanima i koja je to rijec bila kriterij selektiranja određenog medija, pošto je ‘patern’ izraz koji odgovara za više različitih riječi.

Ciljam da mi treba nešto ovakvo:

$query="SELECT medijID,autor FROM medij where medijID in ( SELECT medijID , rijec as myRijec  FROM medij_svojstva WHERE rijec REGEXP 'patern*')"; 

samo što to tako neće raditi…a ja neznam kako bi trebalo napisati.

Hvala.

Probaj ovaj query:

SELECT medij.medijID as medijID, medij.autor as autor, medij_svojstva.rijec as myRijec FROM medij 
INNER JOIN medij_svojstva on medij_svojstva.medijID = medij.medijID
WHERE medij_svojstva.rijec REGEXP 'patern*';

Hvala i to radi.

Samo dobivam ovakav rezultat:
medijID:1 ; autor: autor_1 ; rijec=‘rijec_1’;
medijID:1 ; autor: autor_1 ; rijec=‘rijec_2’;
medijID:1 ; autor: autor_1 ; rijec=‘rijec_3’;

medijID:2; autor: autor_2 ; rijec=‘rijec_1’;
medijID:2; autor: autor_2 ; rijec=‘rijec_2’;
medijID:2; autor: autor_2 ; rijec=‘rijec_3’;

Znaci, prvi dio mi se ponavlja dok se vrte varijante rijeci koje dohvati. Nije da nemogu naknadnom logikom si to posložiti onako kako mi treba…ali se pitam jeli moguće opće dobiti rezultat koji bi izgledao nekako ovako:

medijID:1 ; autor: autor_1 ; rijec=array(‘rijec_1’,‘rijec_2’,‘rijec_3’);
medijID:2 ; autor: autor_2 ; rijec=array(‘rijec_1’,‘rijec_2’,‘rijec_3’);

Evo rješenja, dakle ovaj dio:

GROUP_CONCAT(medijID SEPARATOR ', ') AS IDs - vise recorda svrstava samo u 1 record odvojen zarezom.

Query koji tebi treba:

SELECT medijID,autor FROM medij where medijID in ( SELECT GROUP_CONCAT(medijID SEPARATOR ', ') AS IDs FROM medij_svojstva WHERE rijec REGEXP 'patern*)

Jeej, group_concat je ono što mi je trebalo…samo ne razumijem baš kako si točno svoj query zamisliio…a i ne radi mi baš. (Vrti u beskonačno…ne dobivam nikakav response)

Uglavnom, kombinacija group_concat i inner joina je ono što mi treba :smile:

$query="SELECT medij.medijID as medijID, autor, GROUP_CONCAT(medij_svojstva.rijec separator ', ') as rijec FROM medij 
INNER JOIN medij_svojstva on medij_svojstva.medijID = medij.medijID
WHERE medij_svojstva.rijec REGEXP 'pattern*' GROUP BY medijID"; 

I još sam morao dodati GROUP BY medijID, jer bez toga je grupiralo sve pronađene riječi i vratilo ih skupa samo sa prvim pronađenim medijID-om. Znači, vraćalo je samo 1 row.

Hvala vam na pomoći!

No nastaje još jedno pitanje, kako prebrojati elemente tako dobivene sa GROUP BY

$queryCount="SELECT COUNT(medij.medijID) as brojElemenata FROM medij 
INNER JOIN medij_svojstva on medij_svojstva.medijID = medij.medijID
WHERE medij_svojstva.rijec REGEXP 'pattern*' GROUP BY medij.medijID";

…tako bi volio da ide, ali ne ide. Vraca uvijek 1 element. Ako maknem group by, onda vrati vise elemenata. (Vise, jer povecava kad nadje vise rijeci da pripada jednom medijID-u)

Onaj query s kojim sam započeo temu je radio kod prebrojavanja…no ja bi volio da imam analogne query-e s kojim bi dohvaćao elemente i prebrojavao ih. Prebrojavanje je tu jer kod dohvaćanja koristim limit i offset, a trebam i informaciju koliko ima ukupnih elemenata koji odgovaraju pretrazi.
Dali se to može možda kako elegantnije izvesti, bez nužnosti posebnog query-a za prebrojavanje…i posebnog za dohvaćanje??

Pozdrav, drago mi je da sam pomogao, pisao sam query napamet … no dao sam ti funkciju koja radi … i ono sto ti treba, pa se nadam da si slozio … ako nisi javi na PM, pa cu detaljnije pogledati.

Sad vezano za ovaj zadnji post, nije mi bas jasno sto trebas … buduci da ti ovaj query koji si napisao … trebao bi odraditi zeljeno … dakle count(medij.medijID) i na krjau group by medij.medijID. To bi trebalo pobrojati sve medijID-ove shodno REGXP patternu, odnosno napisati koliko ih ima.

Da, gruop_contact je ono što mi je trebalo…da mi grupira rezultat :wink:

A ovaj zadnji query jednostavno neće…mada se i meni čini da bi trebao raditi. Čačkao sam dosta, al nikako s njim na zelenu granu.

Nakraju napravio ovako: (sam query je onda zadan bez offseta i limita)

while($row = mysql_fetch_assoc($result))
  	{
	$count++;
	if($count>$offset && $count<=$limit) array_push($medij,$row);
	}

Niti mi je u ovom slučaju bitna neka optimizacija, pa dobijem barem brojanje točno onoga što i dohvaćam bez slaganja dvaju query-a. (kad neznam izvesti u jednom, ako se moze opce)

…a s druge strane, mjerio sam vrijeme, jer sam negdje nekad pročitao da limit i offset ne ubrzavaju dohvaćanje. I ispalo je da nema razlike selektirao li ja svih 200 medija, ili samo onih 20 koji se nalaze u traženom offsetu. To je bilo kod korištenja REGEXP-a, dok bez regexp-a ipak postoji neka razlika.

350 elemenata odgovara dohvaćanju, ukoliko dohvaća sve (bez limita) , ciklusi od 50 dohvaćanja traju ukupno 0.32 sec
Dok isti query, limitiran na samo 1 element, isto 50 ciklusa, traje 0.26 sec. Znači razlika po jednom ciklusu je samo 0.0012sec ili možda bolje izraženo 18.75% (ali s limitom na samo 1)
Dok recimo limit 0,200 odradi sporije nego dohvaćanje bez limita svih 350 elemenata.

Sa regexp-om, sa limitom na 1, od ukupnih 200 radi brže samo 1.15 %

Zaključno, poseban query za prebrojavanje i poseban za dohvaćanje s limitom bi mogli biti i sporiji nego ovaj gore zdravo seljački pristup :smile: