Aggregate Function missing? [SQL] - SQL/NoSQL - Programmation
Marsh Posté le 21-07-2004 à 17:44:06
donne ta requête stp.
si tu utilise une fonction d'aggération, (count, sum, ...) tu dois faire un GROUP BY
Marsh Posté le 21-07-2004 à 17:46:32
Donc la requette est (dsl si c un peu caotique) :
Code :
|
Et mysql me repond :
#1064 - Erreur de syntaxe près de '( reponse.auteur ) AS lastauteur, LAST( reponse.cree ) AS lastcr' à la ligne 1
Merci d'avance
Marsh Posté le 21-07-2004 à 17:55:14
bon à froid comme ça :
SELECT nom,description,groupe,COUNT(sujets.id) AS countid,LAST(reponse.auteur) AS lastauteur,LAST(reponse.cree) AS lastcree
FROM forums,permissions,reponses,sujets
GROUP BY nom,description,groupe
WHERE forums.id != '0'
AND forums.id = permissions.id_forum
AND sujets.forum_id = forum.id
AND reponses.id_sujet = sujets.id
AND permissions.login = 'Esox'
remarque : having est l'équivalent de WHERE mais pour les fonction d'aggrégation (HAVING SUM(id) > 10)
utilise AND plutôt que &&
Marsh Posté le 21-07-2004 à 17:58:48
as 'countID'
rajoute les ' partout
Marsh Posté le 21-07-2004 à 18:02:00
J'avais penssé a ca, mais sur le site de w3school ils mettent pas les ', et d'ailleur si je les met l'erreur reste pareille
Marsh Posté le 21-07-2004 à 18:04:36
ben en fait en MySQL la fonction LAST() n'existe pas.
le problème vient de là. essaie MAX()
Marsh Posté le 21-07-2004 à 18:05:36
Ui mais avec max je vois mal comment faire ... zut ... et pkoi dans le site de w3c ils disent que ca existe?
Marsh Posté le 21-07-2004 à 18:18:53
il existe plusieurs SGBD, plusieurs version du langage SQL, etc...
Marsh Posté le 21-07-2004 à 18:20:11
Ok ... je m'etais dit que vu qu'ils avaient deja fait la distinction entre MS et SQL, alors tt les sgbd basé sql admettaient cette fonction ...
Marsh Posté le 22-07-2004 à 09:19:28
Est-ce que qqn aurait une idée de comment je peux faire pour obtenir le meme resultat avec Max()? Parceque je vois pas trop... La requette en gros doit faire ça :
Ma table contient une colonne index et une colonne données,et une colonne données2, les colonnes données et données2 peuvent contenir plusieurs fois chaque donnée. J'aimerais que la requete m'indique la valeur de la derniere recurence de donnée quand donnée2 a une valeur précise.
Tout en sachant que les données ne sont pas classées par ordre alphabetique dans la table.
En gros ca serais qqch du genre :
SELECT donnée FROM matable WHERE id = MAX('id') AND donnée2 = 'madonnée'
Qqn vois comment on peut transformer cette requette pour qu'elle soit possible?
Merci
Marsh Posté le 22-07-2004 à 09:46:35
une petite feinte :
SELECT donnée FROM matable WHERE donnée2='madonnée' ORDER BY id DESC LIMIT 1
Marsh Posté le 22-07-2004 à 09:48:19
J'y ai penssé aussi mais si plusieurs associations donnée => donnée2 existent ca marchera pas... et dans mon cas c'est justement ce qui se passe
Marsh Posté le 22-07-2004 à 09:53:04
tu moment que tu utilise une fonction d'agégation (max) tu dois utiliser group by si tu as d'autres champs.
en faisant ceci, tu ne peux que perdre les infos multiple de donnée => donnée2
je crois que tu as mal modélisé ton truc. ou alors fais plusieurs requète (c'est mieux 2 requètes qu'une requète pourrie)
Marsh Posté le 22-07-2004 à 09:57:29
Donc c impossible de transformer ma requette initiale (celle en haut du topic) de la sorte qu'elle n'utilise pas LAST() ? Soit faut que je fasse plusieurs requettes soit que je change mes tables?
Marsh Posté le 22-07-2004 à 10:08:03
si tu demande le LAST, MAX, ou autre, la requête ne va retourner qu'un seule ligne par champ non groupé. imaginons
j'ai un table client. ces clients peuvent habiter à n localités (j'ai donc une table habiter, et une table localite) 3 tables.
si j'ai 3 adresses, et que je demande LAST, MAX, SUM ou autre, je n'aurais plus qu'une ligne par user, et non pas 3
bref. le fonctions d'aggrégation peuvent t'aider, mais tu ne peux pas les utiliser à tout va
Marsh Posté le 22-07-2004 à 10:13:17
Oui ca je l'avais compris .C'est p-e moi qui me suis mal exprimé auparavant.
Mais pour ce que je veux faire, ma requete serait parfaite s'il y avais pas ce LAST() a convertir en autre chose ... et la est tout le probleme .. j'arrive pas du tout a m'imaginer par quoi je peux remplacer ce LAST() tout en ne mettant pas de LIMIT = 1 etant donné que ce select pourra retourner plusieurs données (vu que forum.id n'est pas unique)
Marsh Posté le 22-07-2004 à 11:11:44
ben LAST çA existe pas il faudras faire avec hein
Marsh Posté le 22-07-2004 à 11:31:00
ui je c , par hazard tu vois comment je pourrais tourner ma requette ?
Marsh Posté le 22-07-2004 à 11:38:12
tu regard par rapport au champs date, ou à l'id au pire.
sinon, on dit occurence, pas récurrence
Marsh Posté le 21-07-2004 à 14:11:17
Bonjour,
J'ai un petit problème de sql, j'ai trouver sur ce site :
http://www.w3schools.com/sql/sql_functions.asp
La fonction "LAST()" , mais quand je cherche à l'utiliser, MYSQL ne la detecte pas comme une commande et donc genère une erreur, je suis aller me renseigner sur ce site :
http://dev.mysql.com/doc/mysql/en/ [...] tions.html
Mais il n'y a pas de trace de cette fonction ....
QQn peut me renseigner svp?
Merci d'avance
Esox