8798 sujets

Développement web côté serveur, CMS

Bonjour tout le monde,

J'ai une base de données qui contient une trentaine de tables dont le nom commence à chaque fois par 'action', soit action1, action2, etc...jusqu'à action31.
Dans chacune de ces tables, il y a (entre autre) 2 champs identiques : ID et HEURES

J'aimerai (si c'est possible), en une seule requête, effectuer le compte des ID et la somme des HEURES dans toutes les tables, sans avoir à faire 31 requêtes séparées. Quelqu'un(e) aurait il(elle) une idée ?

Pour info, voilà la requête pour une table


SELECT COUNT(ID) AS STATS, SUM(HEURES) AS TOTAL
FROM action1


Merci pour votre aide
Modifié par volonia75 (28 May 2009 - 15:09)
Administrateur
(Idéalement il devrait être possible de tout fusionner en une table, d'autant plus si la structure de ces tables est semblable)
Hum, chaque table à une structure sensiblement différente. Elles ont toutes en commun l'existence de ces 2 champs, mais chaque table à des champs en plus ou en moins par rapport aux autres (sinon, je n'aurai fait qu'une seule table si elles étaient toutes identiques).

Par contre, ton idée de fusionner en une table m'intrigue, et m'intéresse.

En quelques mots, ça consiste en quoi ? On peut créer une table "temporaire" ?
Salut,

Tu peux aussi essayer de faire une vue, si tu utilises MySQL > 5.0.
Ou alors, comme dit dew, tout mettre dans une seule table (pas forcément grave si des champs ne servent pas dans tous les cas), et si le volume de données est vraiment trop important, garder des tables différentes, mais avec la même structure et faire une merge sur ces tables (si tu es en MyISAM).
Au fait Dew, bravo et merci pour ton Dew Player et ton Dew Slider. Ces 2 petites merveilles sont très soignées et faciles à utiliser Smiley cligne
Salut Agylus,

Je vais regarder cette fonction MERGE de plus près. Quant à faire une "vue" ? c'est quoi ? (j'utilises MySQL 5 avec tables en MyISAM)
Bon, je commence à comprendre l'utilité de faire une vue.

J'ai bien essayé la commande suivante (sur 3 tables pour commencer)

CREATE TABLE total (
ID INT NOT NULL AUTO_INCREMENT,
HEURES CHAR(20), INDEX(ID))
TYPE=MERGE UNION=(action1,action2,action3) INSERT_METHOD=LAST;


Mais si la création s'est bien passée, je ne peux pas la consulter. Voilà le message d'erreur si je souhaite faire

SELECT * FROM total

#1168 - Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist


Je pense que cela vient du fait que mes tables action1, action2 et action3 n'ont pas la même structure (certaines ont plus de champs que d'autres). Mais je pensais que de créer une table en MERGE avec les champs communs à ces tables marcherait.

Une idée de comment résoudre mon problème ?
Non, laisse tomber la vue, j'ai dit une connerie ! Puisque de toute façon pour faire la vue tu dois faire la requête sur l'ensemble de ces tables.

Requête qui pourrait ressembler à :

SELECT
   t1.`ID` + t2.`ID` +  ... AS "Nb actions"
   t1.`heures` + t2.`heures` + ... AS "Heures totales"
FROM
   (
      SELECT
         COUNT( `ID` ) AS "ID"
         SUM( `heures` ) AS "heures"
      FROM
         `action1`
   ) AS t1,
   (
      SELECT
         COUNT( `ID` ) AS "ID"
         SUM( `heures` ) AS "heures"
      FROM
         `action2`
   ) AS t2,
   ...
Merci Agylus,

La requête que tu m'as donné fonctionne comme je veux. J'ai simplement modifié la commande SELECT en mettant des , au lieu de +, car ce n'est pas un cumul du tout, mais le chiffre pour chaque table que je voulais.

Merci encore, ça m'a sauvé.

Bonne fin de journée Smiley smile