webForumDet fria alternativet

Fastnat på en fråga

Databaser & SQLur Databashanterare & SQL

3 svar · 322 visningar · startad av Mr. N.

Medlem sedan sep. 20025 507 inlägg
Frågan#1

Jag satt igår och klurade på en fråga som jag aldrig riktigt fick till, nu har jag inte detaljerna i huvudet med den såg i princip ut såhär:

SELECT m.name, (SELECT COUNT(e.id) FROM events e WHERE e.membername = m.name [här fastnade jag] AND e.date BETWEEN $starttid AND $sluttid) as eventcount
FROM members m
Problemet är att frågan hängde sig när jag skrev såhär (det före den röda texten ställde till det verkade det som).
Nu är detta en grov förenkling av hur frågan ser ut egentligen (och den innehåller med största sannolikhet en massa fel), jag hämtar fler grejer i den yttre frågan egentligen. Men i ren svenska;
Hämta namnet på personerna i databasen (och en massa annat blaj), hämta samtidigt hur många events personen har deltagit i under en viss period. Jag har lyckats göra det genom att ha count() i en separat fråga men jag tycker att det är snyggare om man kan få den nästlad istället, dessutom kan man då sortera på resultatet.

Alltså, problemet ligger i att få min nästlade fråga att matcha på samma namn som i frågan utanför och det står helt still.

Medlem sedan dec. 200012 464 inlägg
#2

Frågan ser bra ut. Vad innebär hänger? Vilka index har du? Vilka datamängder?
Vad händer om du bara kör ovanstående fråga och har villkor på m.name?

Medlem sedan sep. 20025 507 inlägg
#3

Med hänger menar jag att den bara står och snurrar och ingenting händer (om man väntar tillräckligt länge kommer det nog ut en jätteklump med data, men säkert några tusen rader för mycket ;)).
Jag har bara kört med väldigt simpla tabeller med rätt begränsade datamängder hittills så jag har inte lärt mig index. :r
Såhär ser de ut (ungefär):

member
id | name | class | några andra grejer

event
id | name | date

Sen sitter det en kopplingstabell mellan de två, men jag förenklade bort den i frågan jag skrev här.

Datamängderna är hyfsat små, men jag vet faktiskt inte hur små de är.

Du menar om jag kör SELECT COUNT(e.id) FROM events e WHERE e.membername = 'Rolf' AND e.date BETWEEN $starttid AND $sluttid?
Det funkar bra, som sagt så går det att köra de två frågorna separat och använda namnet man får ut i den första frågan som matchning i den andra.

Jag funderade på om det inte borde gå att fixa det här utan att nästla frågorna. Alltså något i stil med:
SELECT COUNT(e.id), m.name
FROM events e, members m
WHERE e.membername = m.name AND e.date BETWEEN $starttid AND $sluttid
GROUP BY m.name

eller om den där tidschecken ställer till det på något sätt?

Medlem sedan maj 2005562 inlägg
#4

Du kan testa.

SELECT 
    m.name, COUNT(e.id) as antal
FROM
    events e
LEFT JOIN
    members m
    ON 
    m.name = e.membername
WHERE 
    e.date BETWEEN $starttid AND $sluttid
GROUP BY m.name
;

sen kan du köra en EXPLAIN på frågan och se hur den kommer att söka, och försöka optimera den utefter det.

dvs du lägger på explain innan tidigare frågan.

144 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)