Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/12/2011, 12h33   #1
Invité de passage
 
Inscription : août 2011
Messages : 9
Détails du profil
Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : août 2011
Messages : 9
Points : 0
Points : 0
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 :
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.
exilquery est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 13h13   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 654
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 654
Points : 2 656
Points : 2 656
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 ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 14h21   #3
Invité de passage
 
Inscription : août 2011
Messages : 9
Détails du profil
Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : août 2011
Messages : 9
Points : 0
Points : 0
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 :
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).
exilquery est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 14h35   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 654
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 654
Points : 2 656
Points : 2 656
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 :
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.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 14h47   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 333
Points : 18 333
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 14h55   #6
Invité de passage
 
Inscription : août 2011
Messages : 9
Détails du profil
Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : août 2011
Messages : 9
Points : 0
Points : 0
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.
exilquery est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 14h56   #7
Invité de passage
 
Inscription : août 2011
Messages : 9
Détails du profil
Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : août 2011
Messages : 9
Points : 0
Points : 0
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.
exilquery est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 15h00   #8
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 654
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 654
Points : 2 656
Points : 2 656
je ne sais pas la syntaxe exact mais une des solutions suivantes marchera :

Code :
1
2
3
4
5
6
7
8
 
(SELECT ma_col
FROM table2
WHERE ma_cond = ?)
union
(SELECT ma_col
FROM table2
WHERE ma_cond = ?)
ou
Code :
1
2
3
4
5
6
7
 
(SELECT ma_col, ma_cond
FROM table1)
union
(SELECT ma_col, ma_cond
FROM table2)
WHERE ma_cond = ?
ou
Code :
1
2
3
4
5
6
7
 
SELECT *
FROM (
SELECT ma_col, ma_cond FROM table1
union
SELECT ma_col, ma_cond FROM table2) AS a
WHERE ma_cond = ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 15h20   #9
Invité de passage
 
Inscription : août 2011
Messages : 9
Détails du profil
Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : août 2011
Messages : 9
Points : 0
Points : 0
Super, la troisième syntaxe semble marcher. Merci beaucoup.
Sujet résolu je pense.
exilquery est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h45.


 
 
 
 
Partenaires

Hébergement Web