22. august 2004 - 16:46Der er
6 kommentarer og 1 løsning
SQL Query
Jeg har lidt problemer med at gennemskue, hvordan jeg skal opbygge min SQL query. Hvis vi ser på en ultra simpel udgave af mit problem, hvor jeg har to tabeller:
"Tabel1" med feltet: "id" (autonummer, primary key) "Tabel2" med felterne: "id" (autonummer, primary key) og "ref" (tal)
Feltet "ref" i Tabel2 indeholder et tal, som er en henvisning til feltet "id" i Tabel1 (mener det hedder foreign key).
Mit problem er som følger:
Jeg vil gerne udskrive alle records fra Tabel1, og samtidig udskrive, hvor mange records i Tabel2 der i feltet "ref" henviser til hver enkelt record i Tabel1.
Et eksempel:
Tabel1: --------- id 1 2 3
Tabel2: --------- id ref 1 1 2 1 3 3 4 1
Visning: --------- id: 1, antal henvisninger: 3 id: 2, antal henvisninger: 0 id: 3, antal henvisninger: 1
Jeg ville gerne kunne løse dette problem med én enkelt SQL sætning, og her snakker vi IKKE MS SQL! Jeg arbejder med god gammeldags MS Access SQL. Kan det lade sig gøre?
sql = "select tabel1.id, count(tabel2.ref) as antal from tabel1 inner join tabel2 on tabel1.id=tabel2.ref group by tabel1.id" set rs = Conn.Execute(sql)
do while not rs.EOF Response.write "id: " & rs("id") & ", antal henvisninger: " & rs("antal") & "<br>" rs.Movenext loop
Næ, forresten - jeg fik det til at virke, men jeg skulle ændre Inner Join til Left Join, da jeg også ville kunne vise records, der har 0 henvisninger i tabel2. Så er det sagt :) Men du skal da stadig have point!
Hmm. Det virkede vist kun i den simple udgave, og ikke i den virkelig verden :) Jeg bliver lige nødt til at spørge yderligere:
Hvis nu vi tilføjer et "ref"-felt til Tabel1, og ser på en ny Tabel3, som har feltet "id" og "titel". tabel1.ref henviser altså til tabel3.id, og Tabel3.titel skal udskrives sammen med det andet. Min query ser nu således ud:
select tabel1.id, tabel3.titel, count(tabel2.ref) as antal from (tabel1 inner join tabel3 on tabel1.ref=tabel3.id) left join tabel2 on tabel1.id=tabel2.ref group by tabel1.id
.. så opstår der en fejl:
"You tried to execute a query that does not include the specified expression 'titel' as part of an aggregate function."
JA det rigtigt med left join den også dem med for tallet vil give 0 :)
Du skal som minimum havde alle kolonnerne med i group by som du vil havde ud, når du har en count :) Det kan også lade sig gøre i den virkelige verden, hvis man stille spørgsmålet så det passet med virkeligheden :)
Prøv sådan her:
sql = "select tabel1.id, tabel3.title, count(tabel2.ref) as antal tabel1.id from (tabel1 LEFT JOIN tabel2 ON tabel1.id = tabel2.ref) INNER JOIN tabel3 ON tabel1.ref = tabel3.id group by tabel1.id, tabel3.title"
Ja, det var nu heller ikke det jeg mente med den virkelige verden, men du forstår nok :)
Jeg takker, og her er så dine point!
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.