11. april 2007 - 16:49Der er
12 kommentarer og 1 løsning
alle poster fra t1, tæl poster i t2 og poster i t3 vha t1
Hej,
Jeg har 3 tables: t1 med flere poster bl.a. et primær id, t2 med flere poster bl.a. et id (refID) som svarer til id i t1 t3 med flere poster bl.a. et id (refID) som svarer til id i t1
Jeg vil så trække alle kolonner i rækken ud af t1, tælle rækker i t2 og t3 som har et id som svarer til id i t1 -kaldet refID.
Har forsøgt dette uden held:
SELECT *, COUNT(b.refID), COUNT(c.refID) FROM t1 a, t2 b, t3 c LEFT JOIN t1 a ON b.refID= a.ID AND c.refID = a.ID WHERE a.ID=5;
SELECT *, COUNT(l.AuthorID) AS counts1, COUNT(s.AuthorID) AS counts1 FROM profiles p, logs l, stories s LEFT JOIN profiles p ON l.AuthorID= p.ID AND stories.AuthorID = p.ID WHERE p.ID=1;
SELECT *, COUNT(b.refID) AS counts1, COUNT(c.refID) AS counts1 FROM t1 a, t2 b, t3 c LEFT JOIN t1 a ON b.refID= a.ID AND c.refID = a.ID WHERE a.ID=5;
Der er lavet nogle ændringer i mysql's måde at læse join på siden 5 (komma noget).... Hvis du smider paranteser rundt om det der rent faktisk skal joines, burde det blive løst. Hvis jeg ikke tager helt fejl, så læses dit join lige nu som vist nedenunder med parantes:
SELECT *, COUNT(b.refID) AS counts1, COUNT(c.refID) AS counts1 FROM t1 a, t2 b, (t3 c LEFT JOIN t1 a ON b.refID= a.ID AND c.refID = a.ID) WHERE a.ID=5;
Forbehold for fejl - men håber det kan lede dig i retningen af noget :)
Hvilke tabeller vil du joine? Hvis du ser på mit sidste indlæg, vil den query med paranteser (som er sådan din database læser din originale query) ikke virke... Som jeg forstår det skal du lave 2 joins - du har jo 2 tabeller hvor du vil tælle resultater fra, udover de resultater du vil trække ud af din query. Men jeg er ikke pro, så det kan da godt være det kan klares med en?
Uanset hvad hænger det i hvertfald ikke sammen i mit hoved før du bruger en af følgende 2 queries, da du enten skal joine b og c med a eller a, b og c med a (lige nu joiner du c med a):
1 - b og c med a: SELECT *, COUNT(b.refID) AS counts1, COUNT(c.refID) AS counts1 FROM t1 a, (t2 b, t3 c LEFT JOIN t1 a ON b.refID= a.ID AND c.refID = a.ID) WHERE a.ID=5;
2 - a, b og c med a: SELECT *, COUNT(b.refID) AS counts1, COUNT(c.refID) AS counts1 FROM (t1 a, t2 b, t3 c LEFT JOIN t1 a ON b.refID= a.ID AND c.refID = a.ID) WHERE a.ID=5;
Med mindre det er vigtigt eller blevet en princip-sag for dig, ku det være du sku overveje at splitte din query op i flere - det gør det som regel mere overskueligt hvis performance ikke er vigtigt :P
Jeg har forsøgt med følgende: SELECT p.*, COUNT(b.ID) AS counts1 FROM t1 p LEFT JOIN t2 b ON b.refID=a.ID WHERE a.ID=5 GROUP BY a.ID;"
Den virker fint.
Men hvis jeg indsætter en JOIN mere, så ganger den de 2 JOINS med hinanden og lægger resultatet i både counts1 og counts2:
SELECT p.*, COUNT(b.ID) AS counts1, COUNT(c.ID) AS counts2 FROM t1 p LEFT JOIN t2 b ON b.refID=a.ID LEFT JOIN t3 c ON c.refID=a.ID WHERE a.ID=5 GROUP BY a.ID;"
perkoch -> den løsning har jeg prøvet - Problemet er at den ganger de 2 COUNTs med hinanden og lægger resultatet i counts1 og count2. Og det skal jo være 2 særskilte sammentællinger!
Så er der ikke primære id i alle tabeller. Men dubletter kan fjernes, som her.... SELECT t1.ID,COUNT(DISTINCT t2.refID),COUNT(DISTINCT t3.refID) FROM t1 LEFT JOIN t2 ON t1.ID=t2.refID LEFT JOIN t3 ON t1.ID=t3.refID GROUP BY t1.ID
Forklaringen er at COUNT returnerer antal rækker som er sendt tilbage. Og da der kun kan være et antal rækker i et resultset, så vil de 2 værdier være de samme.
Grunden til at de er ganget er at man forener antal t2 med antal t3, og joiner dem, det vil give t2*t3, da der for hver række i t2, bliver bundet alle rækker i t3 sammen med.
Der er primære id i alle tabeller. Det er det eneste jeg siger. intet andet. At man benytter DISTINCT hjælper ikke noget.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.