Faire deux requetes sql différente dans une seul ?

Eléphant du PHP | 82 Messages

05 mai 2012, 18:16

Bonjours,

Dans une page, j'ai besoin de deux information totalement différente mais qui sont toutes les deux disponibles dans la même bdd.. Pour gagner en vitesse puis-je faire une seule requête pour récupérer ces deux infos ?

Par exemple pour trouver l id et le nom du réseau + le pseudo d un membre, je fait comme ça :
$query2=$bdd->prepare('SELECT rs_name, rs_id, (SELECT mem_pseudo FROM membres WHERE mem_id = :mem) AS mem_pseudo FROM reseaux 
				WHERE rs_id = : ort_id');
				$query2->execute(array(':mem'=>$mem, ': ort_id'=>$ort_id));
				$data2=$query2->fetch();
				$mem_pseudo = $data2['mem_pseudo'];
Cela prend-t- il moins de ressource que de faire 2 requête séparée ?

Et si maintenant, j'aimerais le pseudo, le mail, l'id du membre + l'id du réseau, son nom, son type.. Comment je peux procéder sans faire deux requetes ?

Est-ce tout simplement mieux de faire deux requête ?

Merci

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

05 mai 2012, 20:14

Bonjour,

Cette méthode n'est pas justifiée puisque les 2 requêtes n'ont pas de relation (du moins tel que tu le présente) et puisque tu utilise la sous-requête simplement pour déterminer un champ cela rend de la requête principale une véritable usine à gaz, car une sous-requête de champ se répète pour toutes les lignes retournées par le select principal. Cela s’aggrave par le fait d'intégrer d'autres champs du membre. Cela rend systématiquement obsolète cette méthode car tu dois intégrer autant de copies de la sous-requête qui détermine le pseudo du membre que de champs que tu souhaite encore ajouter.

La bonne méthode dans ton cas est d'exécuter 2 requêtes séparées : une pour sélectionner un réseau et l'autre doit donc être réservée à la sélection des données du membre.

Par contre, s'il y a une relation entre les 2 tables reseaux et membres, alors tu peux exécuter une seule requête puisque tu peux utiliser une jointure (JOIN) des 2 tables dans le FROM.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 82 Messages

06 mai 2012, 02:49

Bonjour,

Merci pour cette réponse !

non, non les deux requête n'en aucun rapport, c'est bien pour ça que je poste sur le forum.. Sinon, je sais très bien faire des jointures.

Je me disais juste que cela était plus rapide de demander les deux choses différente dans une seule requête, car c'est embêtant de faire 2 requêtes juste pour ça..

Mais tu me confirmes donc que la meilleur solution niveau ressource utilisée est bien de faire de requête séparée ?

Merci

Eléphant du PHP | 127 Messages

06 mai 2012, 11:46

Bonjour,

si tu as des contraintes de performances, privilégie la mise en cache. Peut-être ta table "reseaux" est-elle suffisamment petite pour être stockée en cache mémoire (type APC ou memcache).

Eléphant du PHP | 82 Messages

06 mai 2012, 14:41

Merci pour ta réponse !

Non, je n'ai pas de contrainte de ressource, je me demandais juste si il était possible de faire deux requete totalement différente en une seule, car ça serait un gain de temps.