Avatar billede m_sorensen Nybegynder
23. januar 2004 - 13:15 Der er 14 kommentarer og
1 løsning

Vælg poster med flest point

Mit eventyr med konvertering fra Access til mySQL går strygende. Dog har jeg stadig lidt problemer her og der, som jeg ikke synes at kunne løse. Følgende SQL, skal vælge de 20 poster, som har flest point, og som ikke er ældre end 1 måned.

SQL i Access:
SQL = "SELECT TOP 20 photos.id, SUM(comments.stars) AS totalstars FROM photos,comments GROUP BY photos.id, photos.addeddate, comments.photo, photos.name, photos.path HAVING comments.photo = photos.id AND photos.addeddate > dateadd('d',-29,now()) ORDER BY SUM(comments.stars) DESC;"

SQL i mySQL (ind til videre):
SQL = "SELECT photos.id, SUM(comments.stars) AS totalstars, comments.photo FROM photos,comments GROUP BY photos.id HAVING comments.photo = photos.id AND TO_DAYS(now()) - TO_DAYS(photos.addeddate) <= " & intDays & " ORDER BY totalstars DESC limit 0,20"

Nogen forslag til, hvad der er galt ?

Dette er fejlen jeg får:
Microsoft OLE DB Provider for ODBC Drivers error '80004005'

[TCX][MyODBC]Unknown column 'comments.photo' in 'having clause'
Avatar billede sbm Nybegynder
23. januar 2004 - 14:02 #1
Den sidste linie.

[TCX][MyODBC]Unknown column 'comments.photo' in 'having clause'

Den hævder at den ikke kender comments.photo
Avatar billede m_sorensen Nybegynder
23. januar 2004 - 14:09 #2
men den findes, det er 100%
Avatar billede sbm Nybegynder
23. januar 2004 - 14:35 #3
Mja. Jeg sad også og studsede over hvorfor den så ikke brokkede sig over den samme kolonne i select delen, for det checker den sædvanligvis først...

Jeg kan ikke lige gennemskue... Hvordan passer din photos.comments ind i din group by? Hvor ID kan grupperes og TOTALSTARS kan lægges sammen, går det jo ikke så fedt med photos.comments , som jeg kan forestille mig er mange forskellige kommentarer...?
Avatar billede m_sorensen Nybegynder
23. januar 2004 - 15:18 #4
Der skulle da ikke så gerne stå photos.comments nogen steder, for den findes ikke...
Avatar billede eagleeye Praktikant
23. januar 2004 - 16:08 #5
hedder kolonnen comments eller Comments det er ikke helt ligemeget med mySQL. Nogle gange vil den havde rigtig case.
Avatar billede m_sorensen Nybegynder
23. januar 2004 - 16:59 #6
den hedder comments.photo.. jeg bruger altid små bogstaver i navn i databasen.
Avatar billede eagleeye Praktikant
23. januar 2004 - 17:03 #7
jeg ved ikke helt hvordan mySQL har det med HAVING men jeg ville skrive det som en JOIN:

SQL = "SELECT photos.id, SUM(comments.stars) AS totalstars, comments.photo FROM photos LEFT JOIN comments ON photos.id = comments.photo GROUP BY photos.id HAVING TO_DAYS(now()) - TO_DAYS(photos.addeddate) <= " & intDays & " ORDER BY totalstars DESC limit 0,20"


Eller med WHERE helt uden HAVING:

SQL = "SELECT photos.id, SUM(comments.stars) AS totalstars, comments.photo FROM photos LEFT JOIN comments ON photos.id = comments.photo WHERE TO_DAYS(now()) - TO_DAYS(photos.addeddate) <= " & intDays & " GROUP BY photos.id ORDER BY totalstars DESC limit 0,20"
Avatar billede m_sorensen Nybegynder
23. januar 2004 - 17:51 #8
Hhmm.. underligt. Siden går fuldstændigt i koma, når jeg prøver at køre dit sidste eksempel. Ved det først, melder den akurat samme fejl som før, bare med photos.addeddate som ukendt column.
Avatar billede m_sorensen Nybegynder
24. januar 2004 - 22:59 #9
Hjæææælp :) Scriptet timer ud, ved dit første forslag...
Avatar billede eagleeye Praktikant
25. januar 2004 - 23:08 #10
Hvad men det sidste forslag uden HAVING hvor det er flytte ind i WHERE delen?
Avatar billede eagleeye Praktikant
25. januar 2004 - 23:10 #11
hmm det stod i den anden kommentar.
Har du mange poster?
Avatar billede eagleeye Praktikant
25. januar 2004 - 23:15 #12
Jeg ved ikke om dette ændre meget men du kan prøve:

SQL = "SELECT photos.id, SUM(comments.stars) AS totalstars, comments.photo FROM photos LEFT JOIN comments ON photos.id = comments.photo WHERE DATEDIFF(now(),photos.addeddate) <= " & intDays & " GROUP BY photos.id ORDER BY totalstars DESC limit 0,20"
Avatar billede eagleeye Praktikant
25. januar 2004 - 23:27 #13
Eller skal alle kolonnerne med i GRUOP BY som brliver bruget:

SQL = "SELECT photos.id, SUM(comments.stars) AS totalstars, comments.photo FROM photos LEFT JOIN comments ON photos.id = comments.photo WHERE DATEDIFF(now(),photos.addeddate) <= " & intDays & " GROUP BY photos.id, photos.addeddate, comments.photo ORDER BY totalstars DESC limit 0,20"
Avatar billede m_sorensen Nybegynder
25. januar 2004 - 23:34 #14
SQL = "SELECT photos.id, SUM(comments.stars) as totalstars, path, photos.name FROM photos INNER JOIN comments ON photos.id = comments.photo WHERE category <> 15 AND category <> 32 AND TO_DAYS(now()) - TO_DAYS(photos.addeddate) <= " & intDays & " GROUP BY photos.id ORDER BY totalstars DESC limit 0,20"

Den er jeg kommet frem til virker... jeg ved ikke hvad der har været galt, men Eagleeye du får i hvert fald pointene for at have hjulpet. Så hvis du gider lave et svar :)
Avatar billede eagleeye Praktikant
25. januar 2004 - 23:39 #15
Ok det ved jeg heller ikke ;)
De to ligner hinanden, der er lidt mere med i where delen i den som virker.
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