Rechercher : dans
Par :

[SQL] Requète SQL impliquant 2 bases de donne

Dernière réponse le 13 nov 2008 à 16:16:36 sly-bzh, le 6 fév 2008 à 14:06:04 
 Signaler ce message aux modérateurs

Bonjour à tous et toutes,

J'aurais aimé savoir s'il était possible de faire des requètes SQL sur 2 bases de donnees distinctes du genre :

mysql_connect('localhost','root','');
mysql_select_db('DB1');
mysql_select_db('DB2');

$test = mysql_query("SELECT DB1.champ1.id, DB2.champ2.acc_number FROM DB1.champ1,DB2.champ2 WHERE DB1.champ1.exemple=DB2.champ2.exemple");



J'ai essayé et ça marche pas :(
Je précise que pour l'instant les 2 bases de donnees sont sur le même serveur avec le même root et le même mot de passe (enfin en local, avec root et sans mot de passe quoi...)

D'avance merci
Edit : Au fait je tourne sous mysql, désolé d'avoir oublié de le préciser

Configuration: Windows XP
Firefox 2.0.0.11

Meilleures réponses pour « [SQL] Requète SQL impliquant 2 bases de donne » dans :
SQL - Commande SELECT VoirLe langage de manipulation de données Le SQL est à la fois un langage de manipulation de données et un langage de définition de données. Toutefois, la définition de données est l'oeuvre de l'administrateur de la base de données, c'est pourquoi la...
Le langage SQL VoirQu'appelle-t-on SQL? SQL (Structured Query Language, traduisez Langage de requêtes structuré) est un langage de définition de données (LDD, ou en anglais DDL Data Definition Language), un langage de manipulation de données (LMD, ou en anglais DML,...
PHP - Bases de données VoirPhp permet un interfaçage très simple avec un grand nombre de bases de données. Lorsqu'une base de données n'est pas directement supportée par Php, il est possible d'utiliser un driver ODBC, pilote standard pour communiquer avec les bases de...

1

anonyme20080208, le 6 fév 2008 à 14:11:20

Normal, Mysql n'est pas multibases :) Tu ne peut pas sélectionner deux bases en même temps :)

Répondre à anonyme20080208

2

sly-bzh, le 6 fév 2008 à 14:39:36

Alors désolé de te contredire mais après avoir réessayé (et oui je suis BRETON moi, on me fais pas lacher comme ça xD), ça marche parfaitement. J'avais du faire une faute de frappe ou une connerie comme ça.

Mais mercid'avoir essayé de me répondre, même si en l'occurence, quand on ne sait pas on ne répond pas... J'aurais été Français [;)] j'aurais pu être découragé par ton post et abandonné.

Merci quand même...

Répondre à sly-bzh

3

anonyme20080208, le 6 fév 2008 à 15:26:19

Euh, je te confirme qu'un serveur Mysql 4X est bien multi thread, mais pas multicast, tu perds ton temps ma couille...
http://www.mysql.com/wiki
Le seul moyen est de séparer les requêtes tables par tâbles, mais la sécurité d'un serveur ne t'autorisera de toutes les façons jamais sur un serveur d'exploitation à linker plusieures bases ensemble, c'est tout le temps désactivé par défaut par les administrateurs pour éviter la propagation d'infections par injections mysql... CQFD... Tu en veut une autre couche ?

Répondre à anonyme20080208

4

sly-bzh, le 6 fév 2008 à 16:11:01

Alors ma couille, en l'occurence je m'en contrebalance le coquillard des injections SQL puisque ma question n'était pas là. Et le serveur c'est moi qui le dirige et pas l'inverse !!!!
De toute façon comme je l'ai dit je suis en local. Peut-être ne me suis je pas bien exprimé mais je voulais récupérer des donnees liées des 2 bases pour updater la première... Donc les problèmes de sécurité, queud'chik !!!


Toujours est-il que je l'ai utilisé une bonne dizaine de fois dans la dernière demi-heure et que je compte continuer à l'utiliser, même si comme tu le fais injustement remarquer, ça ne peux pas fonctionner :D

Bonne journée!!!

Répondre à sly-bzh

5

anonyme20080208, le 7 fév 2008 à 11:41:56

Ce n'est pas parceque ta voiture va vite que tu es obligé de dépasser tout le temps les limitations de vitesse ?!
Ce n'est pas parceque le système ne te l'interdit pas que tu dois forcément outrepasser les limites du système...
Ce n'est pas parceque tu fais des conneries que c'est la bonne méthode...
En gros, je persiste et je signe, tu essayes de faire monter en courrant léverest à un escargot... C'est possible, c'est sûr, mais je doute des performances ti vois là :)
Ce n'est pas parceque tu es intelligent que tu ne fera pas de grosses conneries :)
Fais donc ce que l'on te dis, et tu verras, qu'en séparant tes requettes, non seulement tu restera compatible avec les serveurs Web, mais de plus, tes requêtes seront nettement plus rapides et ne mettrons pas au taquet les ressources propres du serveur pour faire plaisir à monsieur qui s'obstine à tuer un mouton avec un cure dent :)
++

Répondre à anonyme20080208

6

sly-bzh, le 7 fév 2008 à 13:04:13

Eh l'autre, on sait tous qu'un escargot ça n'a pas de jambe donc ça peut pas courir...
Et mon script il marche puisqu'il PEUT le faire. Du moment que mysql PEUT le faire, c'est que moi je peux demander à mysql de le faire.
Enfin bref j'en ai terminé avec ça donc voila, je l'ai fait et puis c'est tout !

Répondre à sly-bzh

7

lol40, le 30 oct 2008 à 21:42:40

C'est bien migon votre querelle de clocher à 2 balles ... mais la réponse à la question initiale : elle est où.
Vous semblez fort intelligents, limite incollables, alors montrez et expliquez, communiquez à la communauté votre savoir, au lieu de vous foutre dessus.
J'ai le même souci que sly-bzh et je vourais la suite. De plus, je suis maxi-pressé (et également Breton d'origine !!).
En tout cas, votre baston est drôle pour les visiteurs.
Merci d'expliquer vos affirmations, contraintes de sécurité éventuelles, et scripts (le luxe ...).

Répondre à lol40

8

sly-bzh, le 30 oct 2008 à 22:52:30

Oula, mais c'est que ça date tout ça... Presque 9 mois quand même.

Pour ta question, la réponse se situe dans ma réponse à moi même. Si je me rappelle bien le script qui est dans la question fonctionne.
Après, tout dépend de ce que tu veux faire avec. Moi j'en avais besoin pour "jouer" en local avec 2 bases de données que je voulais regrouper en une seule. Dans ce cas là, pas de problème, lance toi.

Maintenant ,si tu veux le faire en routine sur un site, c'est vrai que ce n'est probablement pas la solution idéale. Comme le disais anonyme20080208, ça bouffe de la puissance à plein régime et niveau sécurité c'est vraiment pas le pied.
D'autant qu'aujourd'hui, avec 9 mois de recul, il me semble que ce ne doit pas être super compliqué de faire 2 requêtes qui te boufferont moins de mémoire (toujours diviser pour mieux régner) et qui de plus laisseront moins de possibilités de hacking.

J'espère que ça te suffira comme réponse. Proverbes bretons : 
Si les mouettes ont pied, il est temps de virer
Il vaut mieux être saoul que con, ça dure moins longtemps

Répondre à sly-bzh

9

letudiante, le 13 nov 2008 à 15:35:44

Ca n'a rien avoir directement avec ce post, sauf que je suis tombée dessus quand je cherchais ma solution et ça m'a aidé pour débuter mon code.
Je souhaitais comparer deux bases de données qui ont la meme structure mais avec des données différentes avec PHP / MYSQL.

En espèrant que ça puisse vous servir:
Vous devez seulement changer

$mysqlServer = "localhost";
$mysqlUser = "adminsql";
$mysqlPassword = "";
$mysqlBase1 = "NomBase1";
$mysqlBase2 = "NomBase2";


Voici le code:

<?
$mysqlServer = "localhost";
$mysqlUser = "adminsql";
$mysqlPassword = "";


$mysqlBase1 = "NomBase1";
$mysqlBase2 = "NomBase2";




$defaultConnexion = mysql_connect($mysqlServer, $mysqlUser, $mysqlPassword)
or die("Impossible de se connecter au serveur ".$mysqlServer." avec le user ".$mysqlUser.". Essayez de vous reconnecter.");





//NOM BDD 1

// On selectionne la base par defaut
mysql_select_db($mysqlBase1, $defaultConnexion)
or die("Impossible de selectionner la base par defaut ".$mysqlBase1);

//NOM BDD 2

mysql_select_db($mysqlBase2, $defaultConnexion)
or die("Impossible de selectionner la base par defaut ".$mysqlBase2);

/////////////////////////////////////////
//POUR CHAQUE TABLE
/////////////////////////////////////////
$mysql_resultTable = mysql_query("SHOW TABLES;",$defaultConnexion);
//prendre chaque rangée
while ($ligneTable = mysql_fetch_row($mysql_resultTable))
{
// afficher le nom d'une table
$table=$ligneTable[0];






/////////////////////////////////////////
//POUR CHAQUE COLONNE -> liste colonnes et clef
/////////////////////////////////////////

//lISTES COLONNES
$listeColonnes=array();
$listeClef=array();
//liste des champs

$resultColonne = mysql_query("SHOW COLUMNS FROM ".$table."");
if (!$resultColonne)
{
echo 'Impossible d\'exécuter la requête : ' . mysql_error(); exit;
}
if (mysql_num_rows($resultColonne) > 0)
{
while ($rowColonne = mysql_fetch_assoc($resultColonne))
{
$listeColonnes[count($listeColonnes)]=$rowColonne['Field'];

if($rowColonne['Key']=='PRI')
{
$listeClef[count($listeClef)]=$rowColonne['Field'];
//echo "Table".$table." clef".$rowColonne['Field']."</br>";
}
}
}

//prendre données d'une table de la première base
$sqlDonnes="SELECT * FROM ".$mysqlBase1.".".$table."";
//echo $sql;
$mysql_resultDonnees = mysql_query($sqlDonnes) ;
/////////////////////////////////////////
//POUR CHAQUE LIGNE D'UNE TABLE D'UNE DES BASES
/////////////////////////////////////////
//prendre chaque rangée
while ($ligneDonnes = mysql_fetch_array($mysql_resultDonnees))
{
$difference="";
// print($ligne["idCritere"]);
$requeteCompare="SELECT * FROM ".$mysqlBase2.".".$table." ";

$clefs="";
for($countclef=0;$countclef<count($listeClef);$countclef++)
{
if($countclef==0)
{
$requeteCompare.= "WHERE ";
}
else
{
$requeteCompare.= " AND ";
}

$clefs.=" ".$listeClef[$countclef].": ".$ligneDonnes[$listeClef[$countclef]]." ";
$requeteCompare.= "".$mysqlBase2.".".$table.".".$listeClef[$countclef]."='".$ligneDonnes[$listeClef[$countclef]]."'";
}//fin boucle clefs
// echo $requeteCompare."</br>";

/////////////////////////////////////////
//POUR CHAQUE LIGNE D'UNE TABLE D'UNE DES BASES COMPARER AVEC LES DONNES DE LA DEUXIEME
/////////////////////////////////////////
$mysql_result2 = mysql_query($requeteCompare);
while ($ligne2 = mysql_fetch_array($mysql_result2))
{
for ($listeColonnescount=0 ; $listeColonnescount<count($listeColonnes) ; $listeColonnescount++)
{
if( $ligne2[$listeColonnes[$listeColonnescount]]!=$ligneDonnes[$listeColonnes[$listeColonnescount]])
{

$difference.="<strong>Colonne</strong> ".$listeColonnes[$listeColonnescount]."<strong> : Base</strong> '".$mysqlBase2."'<strong>:(</strong> ".$ligne2[$listeColonnes[$listeColonnescount]]." <strong>)- Base </strong> '".$mysqlBase1."'<strong>: ( </strong> ".$ligneDonnes[$listeColonnes[$listeColonnescount]].")</br>";
}
}

if($difference!="")
{
echo "<strong>Table</strong> '".$table."' <strong>differences pour clefs</strong> '".$clefs."' <strong>:</strong></br>".$difference." </br>";
}
}
}

}//fin table

?>

Répondre à letudiante

10

 toxi, le 13 nov 2008 à 16:16:36

Bonjour je confirme il est possible d'utiliser 2 base sql dans une même requet

si je me trompe pas

SELECT * FROM `base1`, `base2` HERE `bob=$variable`

*=tous

Répondre à toxi