webForumDet fria alternativet

Alldeles för krångligt för mig... (Massa queries)

Databaser & SQL

9 svar · 436 visningar · startad av Kenchu

Medlem sedan apr. 2004113 inlägg
Frågan#1

Jag har en databas som ser ut på följande sätt:

=======
Tabeller
=======

alternative
===========
id | question_id | alternative

answer
===========
id | alternative_id

form
===========
id | form

question
===========
id | form_id | question

Det här är ett slags polldatabas, där svaren läggs i answer och är relaterade till alternative, som i sin tur är relaterad till question, och question till form.

Alltså, för att göra det lite enklare, ger jag följande exempel:

Formulär
id = 1 - form = Formulär 1
id = 2 - form = Formulär 2

Frågor
id = 1 - form_id = 1 (Denna fråga hör till formulär 1) - question = Är månen blå?
id = 2 - form_id = 1 (Denna fråga hör till formulär 1) - question = Vilken är din favoritfärg?
id = 3 - form_id = 2 (Denna fråga hör till formulär 2) - question = Hur mycket väger solsystemet?

Alternativ
id = 1 - question_id = 1 (Detta alternativ hör till fråga 1) - alternative = Ja
id = 2 - question_id = 1 (Detta alternativ hör till fråga 1) - alternative = Nej
id = 3 - question_id = 2 (Detta alternativ hör till fråga 2) - alternative = Blå
id = 4 - question_id = 2 (Detta alternativ hör till fråga 2) - alternative = Grön
id = 5 - question_id = 3 (Detta alternativ hör till fråga 3) - alternative = > 1kg
id = 6 - question_id = 3 (Detta alternativ hör till fråga 3) - alternative = < 1kg

Answer (Det som användaren svarar läggs in här)
id = 1 - alternative_id = 2 (Den här användaren svarade Nej på fråga 1)
id = 2 - alternative_id = 3 (Den här användaren svarade Blå på fråga 2)

Osv....

Jag har en hemsida på http://www.spelprojektet.tk/, och en av funktionerna till den här sidan skulle vara att skriva ut all statistik för svaren. Detta har visat sig mycket mycket svårare än jag trodde.

Den statistik jag vill skriva ut är hur många procent av varje alternativ som svarats på varje fråga. Rent principiellt är det fruktansvärt enkelt - svaren för varje alternativ delat med mängden av alla svar för just den frågan (dvs svar som har ett alternativ_id som finns under en viss question). Hur ska jag gå tillväga med det här?

Det enda jag lyckts göra hittils är detta:

SELECT alternative.question_id, count(alternative)
FROM alternative
INNER JOIN answer
ON alternative.id = answer.alternative_id
GROUP BY alternative
ORDER BY alternative.id

(Väljer hur många som svarat på varje alternativ, typ.)

Har ni några idéer?

/Kenchu

Medlem sedan dec. 200012 464 inlägg
#2

Den fråga som du har skrivit ser väldig konstig ut i mina öron.

Normalt så grupperar man på de kolumner som inte ingår i någon aggregatfunktion. Sen så gör du order by på en kolumn som inte finns med i resultatet vilket blir väldigt obestämbart när man har group by. Om jag vore en databashanterare så skulle jag returnera flera semantiska fel för den frågan

select q.question,
       a.alternativ,
       100.0*cast(count(aw.id) as decimal(11,2))/
       (select count(*) 
          from answer
         where id = q.id) as percentage
  from question as q 
  join alternative as a on q.id = a.question_id
  left join answer as aw on aw.id = q.id and aw.alternative_id = a.id
group by q.question,
       a.alternativ
Medlem sedan apr. 2004113 inlägg
#3

Mycket möjligt, jag har inte fått någon utbildning i det här, så...

Kanske borde ha nämnt att jag använder mysql. Den kod du gav fungerar iaf inte i phpmyadmin.

Ser fruktansvärt snygg ut iaf. O_o Säkert bara någon liten korrigering som saknas. :)

Medlem sedan mars 20032 667 inlägg
#4

Använder du en mysql-version som är lägre än 4.1 fungerar inte subquerys, vilket LarsGs fråga innehåller.

Medlem sedan apr. 2004113 inlägg
#5

MySQL 4.0.21. :/

Medlem sedan apr. 2004113 inlägg
#6

Kan man inte lösa det på annat vis?

Medlem sedan nov. 20017 144 inlägg
#7

Två sql-frågor kanske.

Medlem sedan apr. 2004113 inlägg
#8

Ja, kanske det. :) Hur skulle de se ut?

Medlem sedan nov. 20017 144 inlägg
#9

r/Glöm det. :r

Medlem sedan apr. 2004113 inlägg
#10

Någon? :(

258 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)