Avatar billede bingokaj Nybegynder
05. november 2005 - 21:02 Der er 11 kommentarer

kombinere 2 sql-sætninger

Hej

Jeg har 2 tabeller, Works og Votes. Works indeholder en liste over værker (bøger, film,etc) og Votes indeholder en liste over stemmer på disse værker. Hver gang en bruger stemmer på et værk laver jeg en row i tabellen Votes, som indeholder værkets ID. 

Mit problem er at jeg gerne vil lave en top-10 baseret på hvor mange stemmer et enkelt værk har fået.

Det kan jeg bare ikke fordi jeg først skal tælle stemmerne sammen i Votes (f.eks. SELECT COUNT(vote_id) FROM Votes WHERE vote_id=1) for hvert enkelt entry jeg har i Works...

Jeg ved det kan lade sig gøre BÅDE at tælle stemmer sammen og loope Works-tabellen igennem on-the-fly, men hvordan ??
Avatar billede erikjacobsen Ekspert
05. november 2005 - 21:10 #1
select top 10 vote_id,count(*) as antal from Votes group by vote_id order by antal desc
Avatar billede bingokaj Nybegynder
06. november 2005 - 11:22 #2
Det er super, virker bare. Men jeg vil gerne trække nogle felter ud fra Works samtidig. Hver entry i Votes har et titel_id som matcher et ID på en entry i Works. Fra Works vil jeg gerne hente følgende felter: titel, kunstner, kategori. Hvis du fikser det, så er pointene dine :-)
Avatar billede erikjacobsen Ekspert
06. november 2005 - 11:23 #3
Det skal så gøres med en join. Ved du hvordan?
Avatar billede bingokaj Nybegynder
06. november 2005 - 11:44 #4
nej
Avatar billede bingokaj Nybegynder
06. november 2005 - 12:45 #5
Hvis jeg forsøger med denne sql-sætning:

SELECT TOP 12 votes.titel_id,COUNT(*) AS antal,works.titel FROM votes,works WHERE votes.titel_id=works.ID GROUP BY votes.titel_id ORDER BY antal DESC

får jeg følgende fejl:

Column 'works.titel' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Hvis jeg fjerner works.titel fra sætningen kører den fint, men jeg får naturligvis ikke selected det jeg gerne vil... :-(
Avatar billede erikjacobsen Ekspert
06. november 2005 - 12:50 #6
En hurtig måde er

SELECT TOP 12 votes.titel_id,COUNT(*) AS antal,max(works.titel) FROM votes,works WHERE votes.titel_id=works.ID GROUP BY votes.titel_id ORDER BY antal DESC
Avatar billede cjensen Nybegynder
06. november 2005 - 12:52 #7
hvad med at tilføje works.titel i group by:
SELECT TOP 12 votes.titel_id,COUNT(*) AS antal,works.titel FROM votes,works WHERE votes.titel_id=works.ID GROUP BY votes.titel_id, works.titel ORDER BY antal DESC
Avatar billede bingokaj Nybegynder
06. november 2005 - 12:58 #8
-> erikjacobsen
jeg får følgende fejl:
Microsoft OLE DB Provider for SQL Server error '80040e14'

The text, ntext, and image data types are invalid in this subquery or aggregate expression.

Hvorfor anvender du max(works.titel) - feltet indeholder en string, ikke en int?

-> cjensen:
jeg får følgende fejl:
Microsoft OLE DB Provider for SQL Server error '80040e14'

The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.
Avatar billede erikjacobsen Ekspert
06. november 2005 - 13:01 #9
Hvis der ikke er nogen grund til at works.titel er en text, så skal den være en varchar (eller nvarchar).
Avatar billede bingokaj Nybegynder
06. november 2005 - 13:38 #10
-> erik, nu virker det sgu:

SELECT TOP 12 votes.titel_id,COUNT(*) AS antal,max(works.titel) AS titel, max(works.kunstner) AS kunstner, max(kategori) AS kategori FROM votes,works WHERE votes.titel_id=works.ID AND works.kategori=" & kategori &" GROUP BY votes.titel_id ORDER BY antal DESC

Jeg blev nødt til at ændre mine text-felter til varchar i databasen.

Jeg synes dog at at det er en lidt underligt at man skal bruge MAX før det virker og at den kun kan selecte felter af en bestemt type... meget upraktisk :-/

anyway, post et svar så får du dine point :-D
Avatar billede erikjacobsen Ekspert
06. november 2005 - 13:41 #11
varchar contra text er noget med effektivitet. Max(..) er nødvendigt for at give mening. I dit eksempel kan de ikke vide at alle works.title er ens, og hvilken skulle den så vælge.

Jeg samler slet ikke på point, tak.
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