Avatar billede lifeenergy Nybegynder
11. april 2007 - 16:49 Der 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;

Hvad gør jeg galt?
Avatar billede lifeenergy Nybegynder
11. april 2007 - 16:51 #1
Hov jeg skal lige have alias på:

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;

Virker stadig ikke som det skal.
Avatar billede nixir Nybegynder
12. april 2007 - 00:02 #2
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 :)
Avatar billede lifeenergy Nybegynder
12. april 2007 - 11:56 #3
Fejlen er den samme
Not unique table/alias: 'a'
Avatar billede nixir Nybegynder
12. april 2007 - 14:09 #4
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
Avatar billede lifeenergy Nybegynder
12. april 2007 - 14:50 #5
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;"
Avatar billede perkoch Nybegynder
12. april 2007 - 15:16 #6
SELECT t1.ID,COUNT(t2.refID),COUNT(t3.refID) FROM t1 LEFT JOIN t2 ON t1.ID=t2.refID LEFT JOIN t3 ON t1.ID=t3.refID GROUP BY t1.ID
Avatar billede lifeenergy Nybegynder
14. april 2007 - 16:44 #7
Jeg vælger en anden løsning
Avatar billede lifeenergy Nybegynder
14. april 2007 - 16:47 #8
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!
Avatar billede lifeenergy Nybegynder
16. april 2007 - 11:18 #9
Jeg lukker
Avatar billede perkoch Nybegynder
17. april 2007 - 08:44 #10
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
Avatar billede lifeenergy Nybegynder
17. april 2007 - 14:06 #11
Der er primære id i alle tabeller.

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.
Avatar billede perkoch Nybegynder
22. april 2007 - 02:09 #12
Ja, det er rigtigt. Men count distinct fjerner stadig dubletterne
Avatar billede lifeenergy Nybegynder
22. april 2007 - 11:44 #13
Der er primære id i alle tabeller. Det er det eneste jeg siger. intet andet.
At man benytter DISTINCT hjælper ikke noget.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester