[Access SQL]Moeilijke query makkelijker?

Pagina: 1
Acties:

  • bramseltje
  • Registratie: September 2001
  • Laatst online: 23-05 10:13
Voor een klein projectje tussendoor ben ik wat aant stoeien gegaan om een programmaatje te brouwen dat van al m'n mp3jtes de ID3 tag leest, en die in een database stopt. (Vraag me maar niet wrom, geen idee :+)

Op zich werkt alles prima, maar nu wilde ik wat queries verzinnen om te kunnen zoeken op verschillende dingetjes. Waar ik me als eerste op geworpen heb is de volgende:

Selecteer alles filenames enzo als er meer dan 5 van één artiest zijn (lekker cryptisch ;))
code:
1
2
3
4
5
6
7
8
SELECT T.Name, Files.Title, Files.FileName, T.CountOfFiles AS [Aantal Bestanden]
FROM
    (SELECT Artists.ArtistID, Artists.Name, Count(files.FileName) As CountOfFiles
     FROM Artists INNER JOIN Files ON Artists.ArtistID = Files.ArtistID
     GROUP BY Artists.ArtistID, Artists.Name
     HAVING Count(Files.FileName) > 5)
AS T INNER JOIN Files ON T.ArtistID = Files.ArtistID
ORDER BY t.CountOfFiles, t.Name;


Maar als je dat zo bekijkt is het een beetje een omslachtige query, of zie ik het nou verkeerd? Ik ben niet zo'n held in Access noch SQL dat ik er ff snel een andere, eenvoudigere versie van kan brouwen. Misschien iemand die me kan helpen in de goede richting te kijken? Of is dit de enige methode waarop Access deze data kan produceren?

Want in wezen zijn het natuurlijk ook gewoon twee queries... Eentje om het aantal files per artiest te krijgen, een eentje om alle files van die artiesten te retourneren. :|

Iemand suggesties?
Ow, normaliseren doen we niet aan... 8)

[ Voor 1% gewijzigd door bramseltje op 31-12-2003 00:02 . Reden: s teveel... ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Bramseltje schreef op 30 december 2003 @ 21:22:
Ow, normaliseren doen we niet aan... 8)
Nouja, veel geluk en geklooi dan maar.
Als je het vertikt om te normaliseren, dan moet je ook niet verwachten dat je je queries op een makkelijkere manier kunt schrijven.

[ Voor 26% gewijzigd door whoami op 30-12-2003 21:30 ]

https://fgheysels.github.io/


  • bramseltje
  • Registratie: September 2001
  • Laatst online: 23-05 10:13
Hmm, zo klinkt 't al iets vriendelijker... tnx whoami ;)

Normaliseren... Da's toch dat je alles op gaat schrijven, en dan een beetje nadenken over een logische indeling? Alle dubbele data apart onderbrenden enzo...

Volgens mij heb ik dat wel redelijk gedaan. Misschien zelfs beetje doorgedraafd, maar goed...

Tabel Artiesten
ID + naam

Tabel Albums
ID + naam

Tabel Genres
Id + naam

Tabel Directory
ID + naam

Tabel Files
ID + artiestID + albumID + GenreID + DirecoryID
+ Titel + duur

Da's m'n database zo'n beetje... :+
De relaties liggen voor de hand, tussen de ID's in files en de betreffende ID in de bijbehorende Tabel.

Natuurlijk zou alles in een tabel kunnen, da's met de meeste verzamelingen mp3tjes niet zo'n ramp, maar het gaat om het idee.

Tips?

  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

Je vroeg een tip he :)

Join alle tabellen (inner join)

Als je bv op artiest wil je selectie uitvoeren

GROUP BY artist.id
HAVING COUNT(*) > 5

Succes !

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
D4Skunk schreef op 31 december 2003 @ 12:41:
GROUP BY artist.id
HAVING COUNT(*) > 5
Dat gaat niet werken. Je moet alle velden in je group by list opnemen die in je select clausule staan die geen aggregated function zijn.

Ik heb net ff een en ander getest, en deze query werkt in Sql Server in de Northwind database:

code:
1
2
3
4
5
6
7
select * from categories
where categoryid in 
( 
  select categoryid from products
  group by categoryid
  having count(categoryid) >= 10
)

[ Voor 32% gewijzigd door whoami op 31-12-2003 12:55 ]

https://fgheysels.github.io/


  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

Dat gaat niet werken. Je moet alle velden in je group by list opnemen die in je select clausule staan die geen aggregated function zijn.
Sorry, je hebt gelijk, je moet een subselect gebruiken dan :o

2de poging :)

Maak 1 view die alle tabellen en velden bevat, en we noemen die bv "overzicht"

En vervolgens :

code:
1
2
3
4
5
6
7
select * 
from overzicht
where artist_id in 
   (select artist_id 
    from overzicht
    group by artist_id
    having count(*)>5)

[ Voor 2% gewijzigd door D4Skunk op 31-12-2003 12:58 . Reden: Damn, te laat 8) ]


  • bramseltje
  • Registratie: September 2001
  • Laatst online: 23-05 10:13
Hmm, als ik dat zo zie, met die SELECT * FROM ... IN ... heb ik in wezen precies het zelfde. Je doet een subquery, waarmee je alle artiesten ophaald, waarna je een query uitvoert die van al die artiesten de goede gegevens selecteerd...

Hmm, met andere woorden, ik heb zo'n beetje vanzelf de juiste query?

edit:

Heb ff die queries die hierboven gegeven worden proberen om te smelten, maar in m'n access invoerveld (Query Designer, SQL invoer) levert me dat een foutmelding op. Draai dan ook geen SQL server, misschien dat het daar aan ligt...

[ Voor 32% gewijzigd door bramseltje op 31-12-2003 17:14 ]

Pagina: 1