TravoniMedlem sedan okt. 20041 556 inlägg Jag har dessa Fyra tabeller
[B]Categories[/B]
--------------------
cId cName
1 Bilar
2 Båtar
3 Hus
4 Flygplan
[B]Objects[/B]
-------------------
oId oName oCat
1 Volvo 1
2 Buster 2
3 Saab 1
4 Sessna 4
[B]Users[/B]
-------------------
uId uName
1 Pelle
2 Kalle
3 Britta
[B]Votes[/B]
--------------------------
vId vOId vRate vUser
1 1 3.0 1
2 1 2.0 2
3 2 1.0 3
Håll i hatten...
Nu skulle jag vilja lista alla kategorier och räkna ihop vad en annan person har röstat på i varje kategori (Antalet röster & snittbetyget), och inte nog med det utan även hur många röster jag har lagt som är lika den andra personens röst.
Ex.
Jag är Kalle och tittar på Pelles "lista".
Bilar (23/12) (4.5/2.5)
Båtar (12/0) (3.75/0)
Hus (11/5) (4.2/3.7)
Flygplan (52/11) (3.2/2.5)
Alltså: Bilar (Pelles röster/Mina röster) (Pelles snittbetyg/Mitt snittbetyg)
...Om detta överhuvudtaget går. :)
Databas är Mysql 5.0 så jag kan ju även skapa views och så om det behövs.
Tips till en barskrapad man emottages varmt.
Peter SMedlem sedan dec. 20025 483 inlägg select c.cname
, concat(sum(case when u.uname = 'Pelle' then 1 else 0 end),
'/',
sum(case when u.uname = 'Kalle' then 1 else 0 end))
, concat(sum(case when u.uname = 'Pelle' then v.vrate else 0 end)
/ sum(case when u.uname = 'Pelle' then 1 else 0 end),
'/',
sum(case when u.uname = 'Kalle' then v.vrate else 0 end)
/ sum(case when u.uname = 'Kalle' then 1 else 0 end))
from votes v
inner
join objects o
on o.oid = v.void
inner
join categories c
on c.cid = o.ocat
inner
join users u
on v.vuser = u.uid
where u.uname
in ('Pelle', 'Kalle')
group
by c.cname
order
by c.cname
TravoniMedlem sedan okt. 20041 556 inlägg Härligt!!! Juste Peter! :f
Du satte spiken i kistan.
TravoniMedlem sedan okt. 20041 556 inlägg Skulle det gå att modifiera denna lite så att snittbetyget endast räknas ut på object som båda har röstat på (oavsätt röst såklart)?
(...och dessutom behålla bådas totala antal röster) :)
Peter SMedlem sedan dec. 20025 483 inlägg select c.cname
, sum(case when u.uname = 'Pelle' then 1 else 0 end) as theirs
, sum(case when u.uname = 'Kalle' then 1 else 0 end) as mine
, concat(sum(case when u.uname = 'Pelle' then v.vrate else 0 end)
/ sum(case when u.uname = 'Pelle' then 1 else 0 end),
'/',
sum(case when u.uname = 'Kalle' then v.vrate else 0 end)
/ sum(case when u.uname = 'Kalle' then 1 else 0 end))
from votes v
inner
join objects o
on o.oid = v.void
inner
join categories c
on c.cid = o.ocat
inner
join users u
on v.vuser = u.uid
where u.uname
in ('Pelle', 'Kalle')
group
by c.cname
having sum(case when u.uname = 'Pelle' then 1 else 0 end) > 0
and sum(case when u.uname = 'Kalle' then 1 else 0 end) > 0
order
by c.cname
TravoniMedlem sedan okt. 20041 556 inlägg Oki, men nu tas ju även de object som den ena(eller andra) inte har röstat på med i snittet på varje kategori.
Ex.
Pelle har röstat på tre objekt i kategorin volvobilar
Volvo v70 3.5
Volvo 940 4.5
Volvo 740 4.0
Kalle har bara röstat på två.
Volvo v70 2.0
Volvo 740 4.0
Då tänker jag mig att endast de objekt som både Pelle och Kalle har röstat på skall tas med i snittet.
Då skulle det se ut så här:
Cat. Theirs Mine Avg.
Volvobilar 3 2 3,75 / 3,0
I ditt fall verkar även Pelles röst tas med i snittet. Eller?
Alltså
Avg. 4,0 / 3,0
Peter SMedlem sedan dec. 20025 483 inlägg select c.cname
, sum(case when u.uname = 'Pelle' then 1 else 0 end) as theirs
, sum(case when u.uname = 'Kalle' then 1 else 0 end) as mine
, concat(sum(case when u.uname = 'Pelle' and v.void in (select void from votes inner join users on vuser = uid where uname = 'Kalle') then v.vrate else 0 end)
/ sum(case when u.uname = 'Pelle' and v.void in (select void from votes inner join users on vuser = uid where uname = 'Kalle') then 1 else 0 end),
'/',
sum(case when u.uname = 'Kalle' and v.void in (select void from votes inner join users on vuser = uid where uname = 'Pelle') then v.vrate else 0 end)
/ sum(case when u.uname = 'Kalle' and v.void in (select void from votes inner join users on vuser = uid where uname = 'Pelle') then 1 else 0 end))
from votes v
inner
join objects o
on o.oid = v.void
inner
join categories c
on c.cid = o.ocat
inner
join users u
on v.vuser = u.uid
where u.uname
in ('Pelle', 'Kalle')
group
by c.cname
having sum(case when u.uname = 'Pelle' then 1 else 0 end) > 0
and sum(case when u.uname = 'Kalle' then 1 else 0 end) > 0
order
by c.cname
TravoniMedlem sedan okt. 20041 556 inlägg Arne vad fet fråga!!!
Ja, ja det kostar å ligga på top.
Jag kanske har fel tabellstruktur eller så?!
Tack jag skall testa, lite å se om jag fixar det.
TravoniMedlem sedan okt. 20041 556 inlägg Denna verkar funka:
select c.cname
, sum(case when u.uname = 'Kalle' then 1 else 0 end) as Ours
, concat(sum(case when u.uname = 'Pelle' then v.vrate else 0 end)
/ sum(case when u.uname = 'Pelle' then 1 else 0 end),
'/',
sum(case when u.uname = 'Kalle' then v.vrate else 0 end)
/ sum(case when u.uname = 'Kalle' then 1 else 0 end))
from votes v
inner
join objects o
on o.oid = v.void
inner
join categories c
on c.cid = o.ocat
inner
join users u
on v.vuser = u.uid
where u.uname
in ('Pelle', 'Kalle')
and o.Id in(SELECT v2.oid FROM votes v2 WHERE v2.uname IN ('Kalle', 'Pelle') GROUP BY v2.id HAVING COUNT(v2.oid) = 2)
group
by c.cname
order
by c.cname