OVH Cloud OVH Cloud

Encapsulation de tables, jointures et doublons

9 réponses
Avatar
loufoque
Bonjour,

Alors voilà, j'explique un peu ma structure.
J'ai des projets, qui peuvent contenir x volumes, chaque volume pouvant
contenir y chapitres. Chaque chapitre a une date de parution.
Je voudrais lister les projets, et indiquer pour chaque projet la date
de parution du dernier chapitre. (x et y peuvent valoir 0, d'où joint
externe)

Au niveau tables, ça se passe comme ça

table projects
champ id
champ title

table volumes
champ id
champ project_id

table chapters
champ id
champ volume_id
champ date

Actuellement, voici comment je fais
SELECT projects.*, chapters.date AS last
FROM projects
LEFT JOIN volumes, chapters ON projects.id = volumes.project_id AND
volumes.id = chapters.volume_id
ORDER BY projects.title, last DESC

Ce qui me ressort tous les projets autant de fois qu'il y a de volumes
en tout, avec à chaque fois un "last" différent (seul le premier "last",
c'est à dire le plus récent, m'intéresse)
Bon comme il s'agit d'un site en php je peux dédoublonner avec mais ça
me gêne un peu, il doit sûrement y avoir un moyen de faire mieux.

PS : Ça doit fonctionner sur MySQL3.x

Merci d'avance pour votre aide.

9 réponses

Avatar
Ph. B.
loufoque wrote:

Bonjour,

Alors voilà, j'explique un peu ma structure.
J'ai des projets, qui peuvent contenir x volumes, chaque volume pouvant
contenir y chapitres. Chaque chapitre a une date de parution.
Je voudrais lister les projets, et indiquer pour chaque projet la date
de parution du dernier chapitre. (x et y peuvent valoir 0, d'où joint
externe)

Au niveau tables, ça se passe comme ça

table projects
champ id
champ title

table volumes
champ id
champ project_id

table chapters
champ id
champ volume_id
champ date

Actuellement, voici comment je fais
SELECT projects.*, chapters.date AS last
FROM projects
LEFT JOIN volumes, chapters ON projects.id = volumes.project_id AND
volumes.id = chapters.volume_id
ORDER BY projects.title, last DESC

Ce qui me ressort tous les projets autant de fois qu'il y a de volumes
en tout, avec à chaque fois un "last" différent (seul le premier "last",
c'est à dire le plus récent, m'intéresse)
Bon comme il s'agit d'un site en php je peux dédoublonner avec mais ça
me gêne un peu, il doit sûrement y avoir un moyen de faire mieux.

PS : Ça doit fonctionner sur MySQL3.x

Merci d'avance pour votre aide.




Bonsoir,

Sous réserve que MySql accepte:

SELECT p.title, max(c.datec) as last
FROM projects p
LEFT JOIN volumes v ON p.id = v.project_id
LEFT JOIN chapters c ON v.id = c.volume_id
GROUP BY p.title
ORDER BY last DESC // ou: ORDER BY 2 DESC

--
Philippe.
Avatar
loufoque
Ph. B. a dit le 01/07/2004 20:39:

Sous réserve que MySql accepte:


il accepte ;)

SELECT p.title, max(c.datec) as last
FROM projects p
LEFT JOIN volumes v ON p.id = v.project_id
LEFT JOIN chapters c ON v.id = c.volume_id
GROUP BY p.title
ORDER BY last DESC // ou: ORDER BY 2 DESC



Merci beaucoup.
C'est exactement ce qu'il me fallait.

Je n'avais pas pensé à la fonction max() (je la connaissais, mais
n'avait jamais vraiment trouvé d'utilité pour)
Décidemment, il faudrait que je revoie l'utilisation de ce genre de
fonctions.
Si quelqu'un avait une bonne url à me fournir, ce serait pas mal.
Avatar
Ph. B.
loufoque wrote:
Ph. B. a dit le 01/07/2004 20:39:

Sous réserve que MySql accepte:



il accepte ;)

SELECT p.title, max(c.datec) as last
FROM projects p
LEFT JOIN volumes v ON p.id = v.project_id
LEFT JOIN chapters c ON v.id = c.volume_id
GROUP BY p.title
ORDER BY last DESC // ou: ORDER BY 2 DESC




Merci beaucoup.
C'est exactement ce qu'il me fallait.

Je n'avais pas pensé à la fonction max() (je la connaissais, mais
n'avait jamais vraiment trouvé d'utilité pour)
Décidemment, il faudrait que je revoie l'utilisation de ce genre de
fonctions.
Si quelqu'un avait une bonne url à me fournir, ce serait pas mal.



Mais bien sur que j'ai une bonne URL à te fournir ! ;-)
Mon ami Frédéric Brouard sera ravi de te donner toutes les explications
sur son site dédié aux SGBD et SQL ! :-)
Trève de barvardage, voici le lien !
http://sqlpro.developpez.com/indexSQL.html

--
Philippe.
Avatar
Antoine Dinimant
quelle est la signification de last ? je ne le trouve pas dans la doc MySQL.
Avatar
Ph. B.
Antoine Dinimant wrote:
quelle est la signification de last ? je ne le trouve pas dans la doc
MySQL.



Dans le cas présent, c'est juste un renommage de colonne et pas un mot réservé
ou autre...

Ex.:
SELECT ID, Nom AS NouveauNom
FROM MaTable

ID | NouveauNom
------+-----------
1 | Toto
2 | Titi
15 | Tata
etc...

--
Philippe.
Avatar
Fred BROUARD - SQLpro
Alors il y a une erreur fondamentale de modélisation !

EN effet rien n'indique dans tes définitions ce qui permet de déterminer quel
est le dernier chapitre....

Et ne va pas me dire que le dernier chapitre c'est celui qui à l'id le plus
élevé, c'est faux...

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************


loufoque a écrit:
Bonjour,

Alors voilà, j'explique un peu ma structure.
J'ai des projets, qui peuvent contenir x volumes, chaque volume pouvant
contenir y chapitres. Chaque chapitre a une date de parution.
Je voudrais lister les projets, et indiquer pour chaque projet la date
de parution du dernier chapitre. (x et y peuvent valoir 0, d'où joint
externe)

Au niveau tables, ça se passe comme ça

table projects
champ id
champ title

table volumes
champ id
champ project_id

table chapters
champ id
champ volume_id
champ date

Actuellement, voici comment je fais
SELECT projects.*, chapters.date AS last
FROM projects
LEFT JOIN volumes, chapters ON projects.id = volumes.project_id AND
volumes.id = chapters.volume_id
ORDER BY projects.title, last DESC

Ce qui me ressort tous les projets autant de fois qu'il y a de volumes
en tout, avec à chaque fois un "last" différent (seul le premier "last",
c'est à dire le plus récent, m'intéresse)
Bon comme il s'agit d'un site en php je peux dédoublonner avec mais ça
me gêne un peu, il doit sûrement y avoir un moyen de faire mieux.

PS : Ça doit fonctionner sur MySQL3.x

Merci d'avance pour votre aide.
Avatar
Fred BROUARD - SQLpro
et max n'est pas une fonction, au sens propre du terme, mais une méthode de
construction d'agrégat statistique !

A +


loufoque a écrit:
Ph. B. a dit le 01/07/2004 20:39:

Sous réserve que MySql accepte:



il accepte ;)

SELECT p.title, max(c.datec) as last
FROM projects p
LEFT JOIN volumes v ON p.id = v.project_id
LEFT JOIN chapters c ON v.id = c.volume_id
GROUP BY p.title
ORDER BY last DESC // ou: ORDER BY 2 DESC




Merci beaucoup.
C'est exactement ce qu'il me fallait.

Je n'avais pas pensé à la fonction max() (je la connaissais, mais
n'avait jamais vraiment trouvé d'utilité pour)
Décidemment, il faudrait que je revoie l'utilisation de ce genre de
fonctions.
Si quelqu'un avait une bonne url à me fournir, ce serait pas mal.



--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
Fred BROUARD - SQLpro
et max n'est pas une fonction, au sens propre du terme, mais une méthode de
construction d'agrégat statistique !

A +


loufoque a écrit:
Ph. B. a dit le 01/07/2004 20:39:

Sous réserve que MySql accepte:



il accepte ;)

SELECT p.title, max(c.datec) as last
FROM projects p
LEFT JOIN volumes v ON p.id = v.project_id
LEFT JOIN chapters c ON v.id = c.volume_id
GROUP BY p.title
ORDER BY last DESC // ou: ORDER BY 2 DESC




Merci beaucoup.
C'est exactement ce qu'il me fallait.

Je n'avais pas pensé à la fonction max() (je la connaissais, mais
n'avait jamais vraiment trouvé d'utilité pour)
Décidemment, il faudrait que je revoie l'utilisation de ce genre de
fonctions.
Si quelqu'un avait une bonne url à me fournir, ce serait pas mal.



--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
loufoque
Fred BROUARD - SQLpro a dit le 02/07/2004 17:26:

Alors il y a une erreur fondamentale de modélisation !

EN effet rien n'indique dans tes définitions ce qui permet de déterminer
quel est le dernier chapitre.....


Si, le champ date.
Enfin on parle du dernier chapitre *paru*, pas du dernier chapitre dans
le volume. Pour ça, j'ai d'autres champs que je n'ai pas indiqués.

Et ne va pas me dire que le dernier chapitre c'est celui qui à l'id le
plus élevé, c'est faux...


Un id n'est rien de plus qu'un identifiant unique. Ce serait une grave
erreur de s'en servir pour un tri, même si avec MySQL l'id est
auto-incréménté.