webForumDet fria alternativet

Gruppera och count (OBS:Knepig)

9 svar · 677 visningar · startad av Travoni

TravoniMedlem sedan okt. 20041 556 inlägg
#1

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
#2
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
#3

Härligt!!! Juste Peter! :f
Du satte spiken i kistan.

TravoniMedlem sedan okt. 20041 556 inlägg
#4

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
#5
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
#6

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

TravoniMedlem sedan okt. 20041 556 inlägg
#7

Tips?

Peter SMedlem sedan dec. 20025 483 inlägg
#8
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
#9

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
#10

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
128 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)