IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Requête SQL sur toutes les tables


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2011
    Messages : 12
    Par défaut Requête SQL sur toutes les tables
    Bonjour,

    Après avoir fouillé sur le net et les tutoriels je ne trouve pas la réponse à ma question, qui semble a priori super simple.

    Je souhaiterais faire une requête préparée sur toutes les tables de ma base de données sachant que ces tables sont totalement similaires (elles ont les mêmes champs). C'est comme si on ajoutait toutes les entrées des tables.

    Voici mon code :

    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
    <?php
    		   try
    		{
    			$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    			$bdd = new PDO('mysql:host=localhost;dbname=base', 'root', '', $pdo_options);
    			
    			$req = $bdd->prepare('SELECT annee, place, nom, album, genre, nationalite, note FROM table1 table2 WHERE annee= ? ORDER BY place');
    			$req->execute(array($_GET['annee']));	 
    					
    				echo '<ul>';
    				while ($donnees = $req->fetch())
    				{
    				 echo '<li>' . $donnees['place'] . ' : ' . $donnees['nom'] . '  ' . $donnees['album'] . ' ' . $donnees['genre'] . ' ' . $donnees['nationalite'] . ' ' . $donnees['note'] . '<br /> '; 
    				}
    				echo '</ul>';
    
    			$req->closeCursor();
    			
    		}
    		
    			catch (Exception $e)
    		{
    				die('Erreur : ' . $e->getMessage());
    		}
    		?>
    Dans l'exemple j'ai mis table1, table2... (ça ne marche évidemment pas) mais le but est d'associer les 10 tables.

    J'aimerais trouver une méthode pour associer toutes les tables ou plusieurs tables :
    - UNION n'a pas marché chez moi, peut-être à cause d'une faute de syntaxe
    - Les jointures ? Mais je n'en vois pas vraiment l'intérêt vu que les champs sont exactement les mêmes. Il ne s'agit pas d'associer des tables hétérogènes.

    Ainsi, et c'est ma question subsidiaire, puisque toutes mes tables ont la même structure/champs, peut-être me suggéreriez-vous de faire UNE seule et même table ? Je ne suis pas fan de cette solution puisque j'aimerais bien avoir une forme de clarté dans ma base avec des tables distinctes.

    Merci de votre attention et de votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,

    union marchera mais enlevera les doublons.
    union all n'enlevera pas les doublons.

    Quelle requête à base d'union avez-vous testé ?

    Ensuite pourquoi avez-vous X table avec la même structure ? N'y aurai-t-il pas un problème de modélisaiton ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2011
    Messages : 12
    Par défaut
    Merci pour cette réponse.

    Pour mon usage d'UNION j'obtiens le contenu de la table 1 quand je sollicite le contenu de la table 2... Cela vient sans doute de la place du WHERE que je ne trouve pas (si je le déplace j'obtiens des erreurs SQL).

    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
    <?php
    		   try
    		{
    			$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    			$bdd = new PDO('mysql:host=localhost;dbname=base', 'root', '', $pdo_options);
     
    			$req = $bdd->prepare('SELECT annee, place, nom, album, genre, nationalite, note FROM table1 UNION SELECT annee, place, nom, album, genre, nationalite, note FROM table2 WHERE annee= ? ORDER BY place');
    			$req->execute(array($_GET['annee']));	 
     
    				echo '<ul>';
    				while ($donnees = $req->fetch())
    				{
    				 echo '<li>' . $donnees['place'] . ' : ' . $donnees['nom'] . '  ' . $donnees['album'] . ' ' . $donnees['genre'] . ' ' . $donnees['nationalite'] . ' ' . $donnees['note'] . '<br /> '; 
    				}
    				echo '</ul>';
     
    			$req->closeCursor();
     
    		}
     
    			catch (Exception $e)
    		{
    				die('Erreur : ' . $e->getMessage());
    		}
    		?>
    En fait, j'ai souhaité séparé le contenu de mes données en différentes tables selon l'année. Mais je me demande finalement, si ce n'est pas mieux de tout réunir en une seule et même table, certes moins claire, mais qui permet un code plus simple (pas d'UNION du coup).

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Oui pas d'union dans ce cas là et moins de maintenance côté requetage / vue.


    Après si vous avez beaucoup de donnée, le partitionning pourra répondre à certain problème de perf : http://dev.mysql.com/doc/refman/5.1/...titioning.html


    Donc pour en revenir au problème initiale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    'SELECT annee, place, nom, album, genre, nationalite, note 
    FROM table1 
    UNION SELECT annee, place, nom, album, genre, nationalite, note 
    FROM table2 
    WHERE annee= ? 
    ORDER BY place
    si vous voullez que la clause where soit que sur une des tables, je pense qu'il faut rajouter des parenthèses entre chaque requête.

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Effectivement, ce serait beaucoup mieux avec une seule table !

    La clarté dans la BDD, c'est un modèle de données rigoureusement normalisé qui la donne, pas le pseudo confort du développeur qui après se retrouve à devoir inventer une usine à gaz pour obtenir les données qu'il souhaite !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2011
    Messages : 12
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Effectivement, ce serait beaucoup mieux avec une seule table !

    La clarté dans la BDD, c'est un modèle de données rigoureusement normalisé qui la donne, pas le pseudo confort du développeur qui après se retrouve à devoir inventer une usine à gaz pour obtenir les données qu'il souhaite !
    Ok, je réfléchissais à ça justement. Je pense que je vais m'orienter vers une bd unifiée, c'est plus dans l'esprit des bd.
    Maintenant, si quelqu'un trouve une solution à mon code, je suis preneur également.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2011
    Messages : 12
    Par défaut
    Disons que je souhaiterais que le WHERE face le tri à partir de l'ensemble des données (des tables du FROM).

    Avec mon code cela ne fonctionne pas : quand la table2 est sélectionnée (parce que le "annee = ?" y correspond), eh bien le contenu de table1 et de table2 s'affiche, alors que la table1 ne devrait pas être sollicitée.

    Avec des parenthèses supplémentaires, j'obtiens des erreurs SQL.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Delete mutli-table sur toutes les tables d'une database
    Par Aurélie38 dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2008, 16h03
  2. recherche sur toutes les tables
    Par galinette dans le forum Access
    Réponses: 1
    Dernier message: 29/06/2007, 11h16
  3. Réponses: 3
    Dernier message: 14/03/2007, 17h31
  4. Grant sur toutes les tables en même temps
    Par jer64 dans le forum SQL
    Réponses: 3
    Dernier message: 25/09/2006, 07h59
  5. Réponses: 4
    Dernier message: 06/09/2006, 14h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo