23. januar 2004 - 13:15Der 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'
Støv, fibre og metalliske partikler kan påvirke både uptime, levetid og driftssikkerhed. Derfor arbejder flere datacentre systematisk med contamination control.
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...?
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"
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.
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"
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"
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 :)
Ok det ved jeg heller ikke ;) De to ligner hinanden, der er lidt mere med i where delen i den som virker.
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.