8797 sujets

Développement web côté serveur, CMS

Bonjour,

Je possède une table produit par département français (soit 96 tables).
Toutes les tables ont la même structure.
Je possède une table région qui me donne le code insee de la région, et une table département ou pour chaque département il y a le code insee région.

Ce que je veux faire c'est une page par région (celle par département ne me pose pas de problème):

Donc à partir des tables citées ci-dessus, j'obtiens facilement les départements pour une région donné

exemple :
Pour la Bretagne, ma requête me sort les départements:

ille-et-vilaine
morbihan
finistére
cotes d'armor.

Il est également facile ensuite de retrouver le nom des tables de ces départements, puisque également construit de la même façon.

Ce qui va me donner pour la Bretagne:
mon_produit_ille_et_vilaine
mon_produit_morbihan
mon_produit_finistere
mon_produit_cote_d_armor

Je voudrais ensuite afficher 9 éléments pris au hasard (ORDER BY RAND() LIMIT 9) dans les tables des départements de la Bretagne.

Je souhaite donc faire une page par région et toujours afficher 9 éléments. en sachant que chaque région n'a pas le même nombre de départements.

Donc je sais retrouver les départements d'une région.
Reconstruire le nom des tables de ces départements.

Mais quelle requête faire pour aller chercher 9 éléments au hasard dans ces tables ? Smiley eek

Si vous avez des idées ?

Merci d'avance.
Euh... si tu as la main sur la base tu devrais regrouper tes 96 tables en 1 seule (en rajoutant le code insee région et le code département) et du coup ta requête est toute simple Smiley cligne !

Ou alors, pour faire plaisir à Herbert Merise Smiley lol , ne rajouter que le code département et faire le lien avec ta table region...
Sur que tu devrais tout regrouper, ce serait bien plus simple. Sinon, pour ta configuration actuelle, tu dois utiliser les jointures, exemple simple :


SELECT a.champ, b.champ, c.champ FROM base1 a JOIN base2 b JOIN base3 c
Re',

la solution JOIN ne va pas fonctionner dans ce cas puisqu'elle va juste agréger les enregistrements des différentes tables sur une seule ligne Smiley cligne .

On pourrait s'en sortir en utilisant UNION :
SELECT * FROM base1 UNION SELECT * FROM base2 UNION SELECT * FROM base3 ORDER BY RAND() LIMIT 9
mais au risque d'insister lourdement Smiley boulet , ce n'est pas seulement pour simplifier les choses qu'il faudrait regrouper les tables mais bien parce qu'il s'agit d'une erreur de modélisation Smiley langue .

Pour prendre un exemple un peu excessif c'est comme si, au lieu d'avoir une table villes, tu avais 26 tables, chacune correspondant à la première lettre (villes_commencant_par_A, villes_commencant_par_B, villes_commencant_par_C, etc...) Smiley scared ! Tu imagines la galère pour récupérer tes données !

Sinon je viens de retrouver un lien donné par Lanza sur un autre post : Forme normale (bases de données relationnelles).

A+
Modifié par Heyoan (22 Dec 2007 - 13:34)
a écrit :

Euh... si tu as la main sur la base tu devrais regrouper tes 96 tables en 1 seule (en rajoutant le code insee région et le code département) et du coup ta requête est toute simple cligne !


C'est moi qui est créer les tables, je pensais que ça allais être plus simple comme cela, mais c'est vrai que pour faire une page par région ça deviens compliqué.

Donc je recommence en regroupant tout.

Merci de vos réponses.