Avatar billede Slettet bruger
09. april 2006 - 12:35 Der er 23 kommentarer og
1 løsning

Distinct, top 10 og inner join.

Jeg har 2 tabeller i en access db (wallpapers og products):

Wallpapers indeholder:
gID* | gProduct_id | gAdded

Products indeholder:
pID* | pDanish_title | pCategory | pCover

Dem med * er dem der sammenlignes i inner join. Jeg vil så bruge distinct til at finde alle unikke gProduct_id's (wallpapers) og derefter skal de tilbage værende sorteres efter gAdded, derefter skal jeg så finde de 10 sidste produkter der er blevet tilføjet wallpapers til (altså dem jeg har distinct). Hvordan gøres dette da jeg ikke kan bruge distinct og top10 i samme select ???

SELECT wallpapers.*, products.* FROM wallpapers INNER JOIN products ON wallpapers.gProduct_id = products.pID WHERE products.pCover=true order by wallpapers.gAdded desc
Avatar billede slashdotdoek Nybegynder
09. april 2006 - 13:01 #1
hej hej,
prøv at anvende UNION istedet, så kan du tage distinct i den ene tabel og lave en count på den anden. Altså recordset sammenlignes ved syntaksen:

(SELECT blabla FROM blabla WHERE blabla) UNION (SELECT blabla2 FROM bla2 WHERE bla3)

Held og lykke.
Avatar billede Slettet bruger
09. april 2006 - 13:52 #2
Jeg tror ikke jeg gør det helt rigtigt for som koden ser ud nu får jeg følgende fejl:

Microsoft JET Database Engine (0x80040E14)
Antallet af kolonner i de to markerede tabeller eller forespørgsler i en foreningsforespørgsel stemmer ikke overens.

Og sådan her ser koden ud:

strSQL = "(SELECT DISTINCT(gProduct_id) FROM wallpapers) UNION (SELECT TOP 10 * FROM products WHERE pCover=true)"

Men da jeg ikke bruger inner join så kan jeg heller ikke sortere top 10 efter gAdded, hvad skal jeg så gøre ?
Avatar billede eagleeye Praktikant
09. april 2006 - 18:30 #3
Det vil sige du i Wallpapers har flere poster hvor gProduct_id er ens. Problemet er hvis man laver distinct på gProduct_id så ved man jo ikke hvilken gAdded man skal tage da den sikker ikke er ens for de gProduct_id som findes. Så hvilken gAdded hvade du tænkt på?
Avatar billede Slettet bruger
09. april 2006 - 20:55 #4
Ja wallpapers har flere poster hvor gProduct_id er ens. Men jeg kan godt beskrive det jeg vil gøre på en lidt anden måde.

Jeg vil have at den finder de sidste 10 produkter der er tilføjet wallpapers til uanset hvor mange billeder der er tilføjet til det enkelte produkt.

Wallpaper tabellen er opbygget sådan at:
gID : Er et autonummer.
gProduct_id : Er et produkt der findes i "products"-tabellen. (derfor kan dette nr findes flere steder i tabellen)
gAdded : Er den dato hvor billedet er tilføjet til db'en.
Avatar billede eagleeye Praktikant
09. april 2006 - 22:26 #5
Ok så kan du bruge group by sådan :

select top 10 gProduct_id, max(gAdded) as agAdded from wallpaper group by gProduct_id order by max(gAdded) desc


Og det du skal tælle er fra products tabellen?
Avatar billede eagleeye Praktikant
09. april 2006 - 22:31 #6
Du ville ikke tælle, du vil havde dem join'et er det ikke rigtigt.
Avatar billede eagleeye Praktikant
09. april 2006 - 22:46 #7
Det du gerne vil havde må være dette eller noget i den stil :)  (som jeg læser det)



select top 10 pDanish_title, pCategory, pCover, gProduct_id, Max(gAdded) AS agAdded from Products inner join wallpaper on Products.pID = wallpaper.gProduct_id group by pDanish_title, pCategory, pCover, gProduct_id order by max(gadded) desc
Avatar billede Slettet bruger
09. april 2006 - 22:51 #8
Jeg tror du har misforstået det lidt...
Jeg skal hente de sidste ti produkter der er tilføjet wallpapers til og så kun udskrive de ti. Det eneste jeg skal bruge products-tabellen til er til at få navnet på produktet da det ikke står i wallpapers-tabellen.

Hvad det angår den kode du gav så virker den ikke helt, for den distincter product_id og viser alle produkter der er tilføjet wallpapers til og ikke kun en top 10...
Avatar billede eagleeye Praktikant
09. april 2006 - 23:02 #9
Skal du kun bruge navnet på produktet for så kan den sidste laves lidt kortere?

Hvis den tager mere end 10 lyder det som om gAdded er ens for alle posterne men så kan den også sortere på pID:


select top 10 pID, pDanish_title, pCategory, pCover, Max(gAdded) from Products inner join wallpaper on Products.pID = wallpaper.gProduct_id group by pID, pDanish_title, pCategory, pCover order by max(gAdded) desc, pID
Avatar billede Slettet bruger
09. april 2006 - 23:05 #10
Har lige testet din anden kode, og det den gør er at den finder de sidste 10 datoer og alle produkter i de dage, og det vil sige at der vil kunne blive 100 produkter hvis det er.
Den skulle meget gerne kunne finde de sidste 10 produkter også selv om det er fra forskellige dage...
Avatar billede eagleeye Praktikant
09. april 2006 - 23:07 #11
Hvilken type er kolonnen gAdded ?
Avatar billede eagleeye Praktikant
09. april 2006 - 23:11 #12
Er det ikke rigtigt at det er gProduct_id og pID som skal joins?
Avatar billede Slettet bruger
09. april 2006 - 23:12 #13
gAdded er et dato-felt (der skrives dato uden til 01-01-2006)

Okay nu nærmer vi os, den sidste kode udskriver nu kun 10 poster, men det er kun den første post der passer, resten er de første produkter i min produkt-tabel (1-2-3 osv)
Avatar billede Slettet bruger
09. april 2006 - 23:18 #14
Jo det er gProduct_id og pID som skal joins.
Og det er så wallpapers der er "hoved"-tabellen og products skal kun bruges til at hente info som pCover og pDanish_title.
Avatar billede eagleeye Praktikant
09. april 2006 - 23:27 #15
pID er det ikke et autonummer? eller kan der være flere med ens pID?
Avatar billede Slettet bruger
09. april 2006 - 23:30 #16
pID er et autonr, det er et produkts unikke nr. Det også det nr som får gProduct_id til at relatere til et produkt.
Avatar billede eagleeye Praktikant
09. april 2006 - 23:37 #17
ok så forstår jeg ikke hvorfor den ikke gør det rigtigt.

Den skulle gerne finde det nyeste billede for hver produkt med max(gAdded) og når de to så er joinet skulle den finde navn på produktet..

du kan prøve denne hvor join ledet er vendt men det vil næppe give noget bedre da det er inner join som bruges:

select top 10 pID, pDanish_title, pCategory, pCover, Max(gAdded) from wallpaper inner join Products on wallpaper.gProduct_id = Products.pID group by pID, pDanish_title, pCategory, pCover order by max(gAdded) desc, pID
Avatar billede Slettet bruger
09. april 2006 - 23:41 #18
Der er ingen forskel uanset hvilken af de to koder jeg bruger....

Den udskriver 177,1,2,3,4,6,7,8,9,10

Den rigtige udskrift skulle være 177,58,85,86,84,83,93,92,33,52

Er der nogle ting feks min database eller noget jeg kan vise dig, så du måske kan se fejlen ?
Avatar billede eagleeye Praktikant
09. april 2006 - 23:46 #19
Du kan prøve denne i stedet for max(gAdded) bruger den max(gID) umiddelbart vil det nyeste billede også havde størst gID, og se om det giver det samme?


select top 10 pID, pDanish_title, pCategory, pCover, Max(gId) as a from wallpaper inner join Products on wallpaper.gProduct_id = Products.pID group by pID, pDanish_title, pCategory, pCover order by max(gId) desc, pID
Avatar billede Slettet bruger
09. april 2006 - 23:52 #20
Der var den jo.....Nu bliver de udskrevet fuldstændig som de står i databasen.

Så hvis du vil lægge et svar så får du de 60 point plus lidt ekstra (hvis jeg ellers kan finde ud af det), og så skal der lyde et stort TAK herfra :)
Avatar billede eagleeye Praktikant
10. april 2006 - 00:00 #21
Ja naturligvis vil jeg lave et svar :)


men jeg vil tilføje at det brugte også virke med max(gAdded)... Det skulle umiddelbart give det samme, kan det være du har skiftet dato format på et tidspunkt??
Avatar billede eagleeye Praktikant
10. april 2006 - 00:01 #22
men det med gId skulle virke lige så godt så længe højst gId svare til højst dato.
Avatar billede Slettet bruger
10. april 2006 - 00:11 #23
gID vil altid være højest sammen med datoen, og hvis der skulle være forskel, så vil det højest dreje sig om sekunder og så vil produkterne jo højest sansynligt vises alligevel...
gAdded skal sådan set også kun fortælle hvornår billedet blev uploaded og om det så er fortidligt at evt. slette det.

PS. Kunne sq ikke finde ud af give flere point, så håber du kan nøjes med 60 ;)
Avatar billede eagleeye Praktikant
10. april 2006 - 00:18 #24
ok.

Ja det er helt i order med de 60 point :)

Det heller ikke helt logisk men til info så gør man det via den menu boks som hedder "Funktioner" der er et link som hedder "Afsæt flere point" som kun er der hvis man har oprettet spørgsmålet og det stadig er åbent.
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
Kurser inden for grundlæggende programmering

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