Bonjour,
non le group by fonctionne comme cela
par contre sous certain SGBD tu ne peux pas faire apparaitre une colonne
qui n'est pas dans le group by sans fonction d'aggregat et donc cette
requete sous SQLServer ne fonctionnera pas par contre en ajoutant un max
sur date tu pourrais avoir la meme chose
Bonjour,
non le group by fonctionne comme cela
par contre sous certain SGBD tu ne peux pas faire apparaitre une colonne
qui n'est pas dans le group by sans fonction d'aggregat et donc cette
requete sous SQLServer ne fonctionnera pas par contre en ajoutant un max
sur date tu pourrais avoir la meme chose
Bonjour,
non le group by fonctionne comme cela
par contre sous certain SGBD tu ne peux pas faire apparaitre une colonne
qui n'est pas dans le group by sans fonction d'aggregat et donc cette
requete sous SQLServer ne fonctionnera pas par contre en ajoutant un max
sur date tu pourrais avoir la meme chose
c'est bien ce que je pensais et c'est la raison pour laquelle le GROUP BY
est assez "aléatoire" dans sa compréhension.
Si je veux que l'appli soit portable sur d'autres SGBD, je ne peux donc
pas utiliser cette requète "spécifique MySQL" ?!
Faut-il que je rajoute un MAX quelconque (sur la date comme tu pensais) ?
Encore merci
c'est bien ce que je pensais et c'est la raison pour laquelle le GROUP BY
est assez "aléatoire" dans sa compréhension.
Si je veux que l'appli soit portable sur d'autres SGBD, je ne peux donc
pas utiliser cette requète "spécifique MySQL" ?!
Faut-il que je rajoute un MAX quelconque (sur la date comme tu pensais) ?
Encore merci
c'est bien ce que je pensais et c'est la raison pour laquelle le GROUP BY
est assez "aléatoire" dans sa compréhension.
Si je veux que l'appli soit portable sur d'autres SGBD, je ne peux donc
pas utiliser cette requète "spécifique MySQL" ?!
Faut-il que je rajoute un MAX quelconque (sur la date comme tu pensais) ?
Encore merci
merci pour cette explication.
Une conclusion s'impose: le standard SQL est encore une vue de l'esprit et -
si j'en juge ton analyse - il recèle de nombreux pièges.
Pour l'instant je vais rester "compatible MySQL 4.1" !
Encore merci
Phil
merci pour cette explication.
Une conclusion s'impose: le standard SQL est encore une vue de l'esprit et -
si j'en juge ton analyse - il recèle de nombreux pièges.
Pour l'instant je vais rester "compatible MySQL 4.1" !
Encore merci
Phil
merci pour cette explication.
Une conclusion s'impose: le standard SQL est encore une vue de l'esprit et -
si j'en juge ton analyse - il recèle de nombreux pièges.
Pour l'instant je vais rester "compatible MySQL 4.1" !
Encore merci
Phil
>
La norme SQL est loin d'être une vue de l'esprit, car si elle n'existait
pas pour chaque système il faudrait apprendre un nouveau langage.
Aujourd'hui, tu vas sur MySQL, Oracle ... tu seras au minimum capable de
lire, ajouter, modifier et effacer les données d'une table. Imagine si
pour chacun de ces moteurs tu devais apprendre des syntaxes différentes.
La première norme est SQL86, sachant qu'aujourd'hui nous sommes à la norme
SQL:2008.
Ces normes impliquent le respect d'une syntaxe pour le langage, mais
également un certain nombre de fonctionnalités.
Les gros éditeurs ne sont pas les plus féroces défenseurs de ces normes
car cela leur permet d'être captif vis à vis de leurs clients.
Faire une application multi SGBD avec des requêtes multi-tables "sans
connaître la spécificité de chaque SGBD" est effectivement une vue de
l'esprit à moins de disposer d'un ORM pour la couche DAO.
>
La norme SQL est loin d'être une vue de l'esprit, car si elle n'existait
pas pour chaque système il faudrait apprendre un nouveau langage.
Aujourd'hui, tu vas sur MySQL, Oracle ... tu seras au minimum capable de
lire, ajouter, modifier et effacer les données d'une table. Imagine si
pour chacun de ces moteurs tu devais apprendre des syntaxes différentes.
La première norme est SQL86, sachant qu'aujourd'hui nous sommes à la norme
SQL:2008.
Ces normes impliquent le respect d'une syntaxe pour le langage, mais
également un certain nombre de fonctionnalités.
Les gros éditeurs ne sont pas les plus féroces défenseurs de ces normes
car cela leur permet d'être captif vis à vis de leurs clients.
Faire une application multi SGBD avec des requêtes multi-tables "sans
connaître la spécificité de chaque SGBD" est effectivement une vue de
l'esprit à moins de disposer d'un ORM pour la couche DAO.
>
La norme SQL est loin d'être une vue de l'esprit, car si elle n'existait
pas pour chaque système il faudrait apprendre un nouveau langage.
Aujourd'hui, tu vas sur MySQL, Oracle ... tu seras au minimum capable de
lire, ajouter, modifier et effacer les données d'une table. Imagine si
pour chacun de ces moteurs tu devais apprendre des syntaxes différentes.
La première norme est SQL86, sachant qu'aujourd'hui nous sommes à la norme
SQL:2008.
Ces normes impliquent le respect d'une syntaxe pour le langage, mais
également un certain nombre de fonctionnalités.
Les gros éditeurs ne sont pas les plus féroces défenseurs de ces normes
car cela leur permet d'être captif vis à vis de leurs clients.
Faire une application multi SGBD avec des requêtes multi-tables "sans
connaître la spécificité de chaque SGBD" est effectivement une vue de
l'esprit à moins de disposer d'un ORM pour la couche DAO.
La norme SQL est loin d'être une vue de l'esprit, car si elle n'existait
pas pour chaque système il faudrait apprendre un nouveau langage.
... 8< 8<
Ces normes impliquent le respect d'une syntaxe pour le langage, mais
également un certain nombre de fonctionnalités.
... 8< 8<
bien sûr.
mais on aurait pu espérer qu'un besoin aussi trivial que "retourne les
dernières lignes de commande pour chaque fournisseur" suive une syntaxe
admise par "tout le monde".
Pour le reste tout à fait d'accord avec toi.
En tous cas merci à tous pour votre aide.
La norme SQL est loin d'être une vue de l'esprit, car si elle n'existait
pas pour chaque système il faudrait apprendre un nouveau langage.
... 8< 8<
Ces normes impliquent le respect d'une syntaxe pour le langage, mais
également un certain nombre de fonctionnalités.
... 8< 8<
bien sûr.
mais on aurait pu espérer qu'un besoin aussi trivial que "retourne les
dernières lignes de commande pour chaque fournisseur" suive une syntaxe
admise par "tout le monde".
Pour le reste tout à fait d'accord avec toi.
En tous cas merci à tous pour votre aide.
La norme SQL est loin d'être une vue de l'esprit, car si elle n'existait
pas pour chaque système il faudrait apprendre un nouveau langage.
... 8< 8<
Ces normes impliquent le respect d'une syntaxe pour le langage, mais
également un certain nombre de fonctionnalités.
... 8< 8<
bien sûr.
mais on aurait pu espérer qu'un besoin aussi trivial que "retourne les
dernières lignes de commande pour chaque fournisseur" suive une syntaxe
admise par "tout le monde".
Pour le reste tout à fait d'accord avec toi.
En tous cas merci à tous pour votre aide.
having maDate = select max(maDate) from maTable where maCondition;
La solution proposée qui fonctionne sous MySQL ne le devrait pas car MySQl
"choisit" de retourner un tuple (qui nous va bien pour cet exemple) alors
qu'il est possible d'en retourner d'autres.
Cordialement,
Manu
having maDate = select max(maDate) from maTable where maCondition;
La solution proposée qui fonctionne sous MySQL ne le devrait pas car MySQl
"choisit" de retourner un tuple (qui nous va bien pour cet exemple) alors
qu'il est possible d'en retourner d'autres.
Cordialement,
Manu
having maDate = select max(maDate) from maTable where maCondition;
La solution proposée qui fonctionne sous MySQL ne le devrait pas car MySQl
"choisit" de retourner un tuple (qui nous va bien pour cet exemple) alors
qu'il est possible d'en retourner d'autres.
Cordialement,
Manu
>
Le véritable mot clé qu'il manque dans les différentes propositions est le
having :
select mesChamps from mesTables
where mesConditions
group by mesChamps
having maDate = select max(maDate) from maTable where maCondition;
La solution proposée qui fonctionne sous MySQL ne le devrait pas car MySQl
"choisit" de retourner un tuple (qui nous va bien pour cet exemple) alors
qu'il est possible d'en retourner d'autres.
Cordialement,
Manu
>
Le véritable mot clé qu'il manque dans les différentes propositions est le
having :
select mesChamps from mesTables
where mesConditions
group by mesChamps
having maDate = select max(maDate) from maTable where maCondition;
La solution proposée qui fonctionne sous MySQL ne le devrait pas car MySQl
"choisit" de retourner un tuple (qui nous va bien pour cet exemple) alors
qu'il est possible d'en retourner d'autres.
Cordialement,
Manu
>
Le véritable mot clé qu'il manque dans les différentes propositions est le
having :
select mesChamps from mesTables
where mesConditions
group by mesChamps
having maDate = select max(maDate) from maTable where maCondition;
La solution proposée qui fonctionne sous MySQL ne le devrait pas car MySQl
"choisit" de retourner un tuple (qui nous va bien pour cet exemple) alors
qu'il est possible d'en retourner d'autres.
Cordialement,
Manu
voici un exemple sous mySQL et vous allez voir comment on change les
données avec le order
ce qui montre que mySQL prend bien le premier tuple
voic la requete
select param_ID as param, code_ID as code ,libelle as lib
from parametres
order by param ASC
et le resultat
param code lib
AFF_MESSAGE_FILTRE 1 si le filtrage change pendant la generation
ALCAN 1 Mini taux alcalinite pour Ok
ALCAN 2 Maxi taux alcalinite pour Ok
CATEGORIEFOUR 1 Titre client / fournisseur
CATEGORIEFOUR 2 Titre client / fournisseur
CATEGORIEFOUR 3 Titre client / fournisseur
regarder bien le ALCAN on le code 1 (deuxieme donnée en premier
maintenant je fais cette requete
select tmp.param,tmp.code
from
(select param_ID as param, code_ID as code ,libelle as lib
from parametres
order by param ASC ) as tmp
group by tmp.param
le resultat
param code
AFF_MESSAGE_FILTRE 1
ALCAN 1
CATEGORIEFOUR 1
maintenant inversons le ORDER
dans dans la requete
select param_ID as param, code_ID as code ,libelle as lib
from parametres
order by param DESC
CATEGORIEFOUR 3 Titre client / fournisseur
CATEGORIEFOUR 2 Titre client / fournisseur
CATEGORIEFOUR 1 Titre client / fournisseur
ALCAN 2 Maxi taux alcalinite pour Ok
ALCAN 1 Mini taux alcalinite pour Ok
AFF_MESSAGE_FILTRE 1 si le filtrage change pendant la generation
on voit le ALCAN 2 en premier
et la requete
select tmp.param,tmp.code
from
(select param_ID as param, code_ID as code ,libelle as lib
from parametres
order by param DESC ) as tmp
group by tmp.param
donne
param code
AFF_MESSAGE_FILTRE 1
ALCAN 2
CATEGORIEFOUR 3
et donc c'est bien le premier tuple qui est pris c'est pour cela qu'il
faut avec le group by avoir les lignes dans l'ordre qu'on veut en
sachant ce que va faire le group by
voici un exemple sous mySQL et vous allez voir comment on change les
données avec le order
ce qui montre que mySQL prend bien le premier tuple
voic la requete
select param_ID as param, code_ID as code ,libelle as lib
from parametres
order by param ASC
et le resultat
param code lib
AFF_MESSAGE_FILTRE 1 si le filtrage change pendant la generation
ALCAN 1 Mini taux alcalinite pour Ok
ALCAN 2 Maxi taux alcalinite pour Ok
CATEGORIEFOUR 1 Titre client / fournisseur
CATEGORIEFOUR 2 Titre client / fournisseur
CATEGORIEFOUR 3 Titre client / fournisseur
regarder bien le ALCAN on le code 1 (deuxieme donnée en premier
maintenant je fais cette requete
select tmp.param,tmp.code
from
(select param_ID as param, code_ID as code ,libelle as lib
from parametres
order by param ASC ) as tmp
group by tmp.param
le resultat
param code
AFF_MESSAGE_FILTRE 1
ALCAN 1
CATEGORIEFOUR 1
maintenant inversons le ORDER
dans dans la requete
select param_ID as param, code_ID as code ,libelle as lib
from parametres
order by param DESC
CATEGORIEFOUR 3 Titre client / fournisseur
CATEGORIEFOUR 2 Titre client / fournisseur
CATEGORIEFOUR 1 Titre client / fournisseur
ALCAN 2 Maxi taux alcalinite pour Ok
ALCAN 1 Mini taux alcalinite pour Ok
AFF_MESSAGE_FILTRE 1 si le filtrage change pendant la generation
on voit le ALCAN 2 en premier
et la requete
select tmp.param,tmp.code
from
(select param_ID as param, code_ID as code ,libelle as lib
from parametres
order by param DESC ) as tmp
group by tmp.param
donne
param code
AFF_MESSAGE_FILTRE 1
ALCAN 2
CATEGORIEFOUR 3
et donc c'est bien le premier tuple qui est pris c'est pour cela qu'il
faut avec le group by avoir les lignes dans l'ordre qu'on veut en
sachant ce que va faire le group by
voici un exemple sous mySQL et vous allez voir comment on change les
données avec le order
ce qui montre que mySQL prend bien le premier tuple
voic la requete
select param_ID as param, code_ID as code ,libelle as lib
from parametres
order by param ASC
et le resultat
param code lib
AFF_MESSAGE_FILTRE 1 si le filtrage change pendant la generation
ALCAN 1 Mini taux alcalinite pour Ok
ALCAN 2 Maxi taux alcalinite pour Ok
CATEGORIEFOUR 1 Titre client / fournisseur
CATEGORIEFOUR 2 Titre client / fournisseur
CATEGORIEFOUR 3 Titre client / fournisseur
regarder bien le ALCAN on le code 1 (deuxieme donnée en premier
maintenant je fais cette requete
select tmp.param,tmp.code
from
(select param_ID as param, code_ID as code ,libelle as lib
from parametres
order by param ASC ) as tmp
group by tmp.param
le resultat
param code
AFF_MESSAGE_FILTRE 1
ALCAN 1
CATEGORIEFOUR 1
maintenant inversons le ORDER
dans dans la requete
select param_ID as param, code_ID as code ,libelle as lib
from parametres
order by param DESC
CATEGORIEFOUR 3 Titre client / fournisseur
CATEGORIEFOUR 2 Titre client / fournisseur
CATEGORIEFOUR 1 Titre client / fournisseur
ALCAN 2 Maxi taux alcalinite pour Ok
ALCAN 1 Mini taux alcalinite pour Ok
AFF_MESSAGE_FILTRE 1 si le filtrage change pendant la generation
on voit le ALCAN 2 en premier
et la requete
select tmp.param,tmp.code
from
(select param_ID as param, code_ID as code ,libelle as lib
from parametres
order by param DESC ) as tmp
group by tmp.param
donne
param code
AFF_MESSAGE_FILTRE 1
ALCAN 2
CATEGORIEFOUR 3
et donc c'est bien le premier tuple qui est pris c'est pour cela qu'il
faut avec le group by avoir les lignes dans l'ordre qu'on veut en
sachant ce que va faire le group by