Bonjour,
Je vais vous expliquer la situation littéralement, puis je vous fourni le schéma de test pour plus de compréhension de mon soucis.
C'est une situation tout à fait classique, imaginons que la base gère un ensemble de produits rangés dans une catégorie. On a donc un ensemble de catégories, un ensemble de produits et des produits classés dans une (ou plusieurs catégorie).
Pour représenter cela on peut avoir le schéma suivant :
Littéralement, ma question est "comment récupérer, pour chaque catégorie les derniers produits ajoutés ?"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 DROP TABLE IF EXISTS _test_catprd; DROP TABLE IF EXISTS _test_cat; CREATE TABLE _test_cat( cat_id INTEGER(11), cat_name VARCHAR(255), PRIMARY KEY (cat_id) ) ENGINE=InnoDB, CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' ; DROP TABLE IF EXISTS _test_prd; CREATE TABLE _test_prd( prd_id INTEGER(11), usr_id INTEGER(11), createDate INTEGER(11), prd_name VARCHAR(255), PRIMARY KEY (prd_id) -- usr_id est une foreign key ... son détail n'est pas nécessaire ici ) ENGINE=InnoDB, CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' ; CREATE TABLE _test_catprd( cat_id INTEGER(11), prd_id INTEGER(11), PRIMARY KEY (cat_id, prd_id), CONSTRAINT _test_catprd_cat_fk FOREIGN KEY (cat_id) REFERENCES _test_cat (cat_id) ON DELETE NO ACTION, CONSTRAINT _test_catprd_prd_fk FOREIGN KEY (prd_id) REFERENCES _test_prd (prd_id) ON DELETE NO ACTION ) ENGINE=InnoDB, CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' ;
Je veux que le select me retourne :
cat_id
prd_id
usr_id associé au prd
createDate
Idéalement je cherche à faire ça en une requête sans sous-requête. J'étais parti sur quelque chose comme :
cette requête ne fonctionne pas, mais illustre ce que je cherche à faire ... (enfin je pense)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT catprd.cat_id, catprd.prd_id, prd.usr_id, prd.createDate FROM _test_catprd catprd INNER JOIN _test_prd prd ON prd.prd_id=catprd.prd_id WHERE prd.createDate=MAX(prd.createDate) GROUP BY catprd.cat_id
J'ai donc besoin de vous. Quelle requête me retournera ce que je cherche ? Mon inquiétude sur le groupage est surtout "comment être sûr que le prd_id et le usr_id retournés sont bien des couples valides" ?
J'imagine qu'une auto-jointure doit permettre de résoudre ce simple problème (d'apparence pour moi en tout cas). Mais je ne suis pas assez familier avec les patterns SQL pour pondre la requête moi-même.
Je cherche une requête pour le SGBD MySQL.
Merci pour votre aide.
Partager