Pomoč SQL stavek
 
Javornik 10. jul 2012 13:17:33 Pridružen od:
15. jun 2010
431 objav
375 27 4
#1

Zdravo!

Prosim za pomoč pri SQL stavku. Imam 3 tabele. Glavna tabela je tabela objave, kjer se shranjujejo objave uporabnikov. Druga in tretja sta tej tabeli podrejeni in se v prvo shranjujejo komentarji na te objave, v drugo pa ogledi teh objav. Moj namen je, da se mi v eni tabeli izpisuje po mesecih in letih sortirano število vseh objav nato pa še koliko unikatnih ljudi je komentiralo v tem mesecu in koliko unikatnih ljudi si je ogledalo objave v tem mesecu.

Takole imam sedaj, vendar mi prikazuje precej večje številke, kakor bi moralo biti.


SELECT
MONTH( FROM_UNIXTIME( statusi.datum ) ) AS mesec,
YEAR( FROM_UNIXTIME( statusi.datum ) ) AS year,
COUNT( statusi.id ) AS stevilo,
COUNT( distinct status_komentar.user_id) AS os_komentar,
COUNT( distinct status_ogled.user_id) AS os_ogled
FROM statusi
LEFT JOIN status_komentar ON statusi.id = status_komentar.status_id
LEFT JOIN status_ogled ON statusi.id = status_ogled.status_id
WHERE statusi.uporabnik_id = '1'

GROUP BY
MONTH( FROM_UNIXTIME( statusi.datum ) ) ,
YEAR( FROM_UNIXTIME( statusi.datum ) )
ORDER BY year DESC , mesec DESC

Torej problem je, da mi potem prikazuje večje številke v vseh poljih. Bi bil kdo toliko prijazen in mi pomagal?



Hvala!


všeč(0) ni všeč(0) spam(0)
 
pavarti 10. jul 2012 13:31:36 Pridružen od:
26. okt 2011
445 objav
587 92 14
#2

Hitra rešitev bi bila s subqueriji:



SELECT

MONTH( FROMUNIXTIME( statusi.datum ) ) AS mesec,

YEAR( FROM
UNIXTIME( statusi.datum ) ) AS year,

COUNT( statusi.id ) AS stevilo,

( SELECT distinct statuskomentar.userid FROM statuskomentar WHERE statusi.id = statuskomentar.statusid) AS oskomentar,

( SELECT distinct statusogled.userid FROM statusogled WHERE statusi.id = statusogled.statusid) AS osogled



FROM statusi

WHERE statusi.uporabnik_id = '1'



GROUP BY

MONTH( FROMUNIXTIME( statusi.datum ) ) ,

YEAR( FROM
UNIXTIME( statusi.datum ) )

ORDER BY year DESC , mesec DESC



Preveri pa hitrost, ker znajo bit zelo počasni.


všeč(1) ni všeč(0) spam(0)
 
Javornik 10. jul 2012 13:35:01 Pridružen od:
15. jun 2010
431 objav
375 27 4
#3

Dobim napako: Subquery returns more than 1 row


všeč(0) ni všeč(0) spam(0)
 
Tody 10. jul 2012 14:00:51 Pridružen od:
3. maj 2010
1446 objav
1411 299 25
#4

Torej imata dva uporabnika enak ID. Na tale SQL se ne spoznam, bolj mi je blizu ORACLE amapak tvojega problema se lotiš tako da najprej ugotoviš da koliko je dejansko stanje in potem delaš na enem primeru. Vrjetno maš preveč ohlapen pogoj. Probaj najprej samo dve tabeli povezat.


všeč(1) ni všeč(0) spam(0)
![](http://www.internetmojster.com/splosno/dobrodelna-akcija.html)
 
Javornik 10. jul 2012 14:01:24 Pridružen od:
15. jun 2010
431 objav
375 27 4
#5

Okej sem ugotovil in popravil. Manjkalo je COUNT v subquery-ih. Vendar še vedno mi ne izpiše pravih števil. Če izvedem tale stavek:


SELECT COUNT( DISTINCT user_id )
FROM `status_komentar`

dobim recimo število 35, ko pa jih preštejem v prejšnji tabeli iz onega querija, jih imam pa 32. Tudi pri ogledih gre navskriž.


všeč(0) ni všeč(0) spam(0)
 
pavarti 10. jul 2012 16:45:40 Pridružen od:
26. okt 2011
445 objav
587 92 14
#6

Pardon, pozabil modati cnt:

SELECT

MONTH( FROMUNIXTIME( statusi.datum ) ) AS mesec,

YEAR( FROM
UNIXTIME( statusi.datum ) ) AS year,

COUNT( statusi.id ) AS stevilo,

( SELECT count(statuskomentar.userid) FROM statuskomentar WHERE statusi.id = statuskomentar.statusid GROUP BY statuskomentar.userid) AS oskomentar,

( SELECT count(statusogled.userid) FROM statusogled WHERE statusi.id = statusogled.statusid GROUP BY statusogled.userid) AS osogled



FROM statusi

WHERE statusi.uporabnik_id = '1'



GROUP BY

MONTH( FROMUNIXTIME( statusi.datum ) ) ,

YEAR( FROM
UNIXTIME( statusi.datum ) )

ORDER BY year DESC , mesec DESC


všeč(1) ni všeč(0) spam(0)
 
Javornik 10. jul 2012 17:14:58 Pridružen od:
15. jun 2010
431 objav
375 27 4
#7

Pavarti hvala za tvoj trud, vendar tole mi javi napako:

Subquery returns more than 1 row


všeč(0) ni všeč(0) spam(0)
 
technolog 10. jul 2012 17:23:06 Pridružen od:
14. nov 2011
598 objav
768 300 22
#8

Pa daj analiziraj vse tri subquerye in poglej kateri vrača več kot eno vrstico... A je tok težko to?


všeč(0) ni všeč(0) spam(0)
Z linuxom že 7 let. Pro web development.
 
kelvan 10. jul 2012 19:07:56 Pridružen od:
19. okt 2007
891 objav
658 122 26
#9

po mojih izkušnjah je včasih pri mysqlu bolje narediti več (enostavnih) queryev kot pa eno klobaso z miljon joini in subqueryi (indexom navkljub)



ob predpostavki, da gre za kombo php/mysql, bi jaz najprej nafilal array statusov (za key daš id), potem pa narediš še querya za komentarje in oglede in dofilaš omenjeni array (itak imaš vedno status_id)


všeč(1) ni všeč(0) spam(0)
 
blackmamba 10. jul 2012 19:22:15 Pridružen od:
4. mar 2008
559 objav
392 25 11
#10

Pa velikokrat se splača kakšne counte in podobne zadeve pohandlati že v logiki in izračune kar zapisati v tabelo. Sploh, ko je treba po tem nato še sortirati.


všeč(1) ni všeč(0) spam(0)
 
 

🔒 Za odgovor na to temo se moraš prijaviti.

Prijavi se