webForumDet fria alternativet

Left join i MySQL

4 svar · 676 visningar · startad av oskob

oskobMedlem sedan maj 20021 558 inlägg
#1

Hallå!

Jag lyckas inte få min left join att fungera som jag vill.
Jag har två tabeller: en med en drös datum och en med en massa statistik.
Det jag vill göra är att summera antal rader i statistiktabellen per dag.
Jag har löst det såhär:

Dates:

ID    Date
1     2007-11-15
2     2007-11-16
3     2007-11-17
osv...

Cache

ID   Date
1    2007-11-15 15:14:33
2    2007-11-15 23:22:22
3    2007-11-17 12:23:34
4    2007-11-18 15:33:12
osv...
SELECT Dates.Date, count( * ) AS Count
FROM Dates
LEFT OUTER JOIN Cache ON Dates.Date = left( Cache.Date, 10 ) 
WHERE Cache.Hit =  'u'
AND Cache.Ref =  'aac'
AND Dates.Date >=  '2007-10-01'
AND Dates.Date <=  '2007-11-31'
GROUP BY Dates.Date

Vilket ger detta resultat:

Date	        Count
2007-10-29      396
2007-10-30	1107
2007-11-02	877
2007-11-03	653

Problemet är att den hoppar över de datum som den inte hittar några rader för. Jag vill att det ska se ut såhär:

Date	        Count
2007-10-29      396
2007-10-30	1107
2007-10-31	0
2007-11-01	0
2007-11-02	877
2007-11-03	653

En left join borde ju ta med Alla rader i den vänstra tabellen, alltså datumen men det gör den ju uppenbarligen inte...

Tacksam för svar!

LarsGMedlem sedan dec. 200012 464 inlägg
#2
SELECT Dates.Date, count( * ) AS Count
FROM Dates
LEFT OUTER JOIN Cache ON Dates.Date = left( Cache.Date, 10 ) 
 and Cache.Hit =  'u'
AND Cache.Ref =  'aac'
where Dates.Date >=  '2007-10-01'
AND Dates.Date <=  '2007-11-31'
GROUP BY Dates.Date
oskobMedlem sedan maj 20021 558 inlägg
#3

Oj... Det där verkarde vara otroligt tungt för databasen. Det tog 51 sekunder att utföra det där. Det förra tog knappt 1 sekund. Och det bara ca 200 000 rader.
Dessutom får alla datum där inga rader hittades värdet 1 istället för 0 (eller null).
Konstigt... :(

GeinMedlem sedan sep. 20005 700 inlägg
#4

Inte så konstigt att den får värdet 1. Den hittar ju en rad, även om det råkar vara NULL-värden på högersidan av joinen. Prova istället count(Cache.Id).

oskobMedlem sedan maj 20021 558 inlägg
#5

Ah, det löste den biffen! Man det tar ju fortfarande nästan en minut att genomföra... Jättekonstigt att det blir så segt bara för att man flyttar villkoren till join-raden istället för where...

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