Créer une jointure ou une sous-requete ?

Eléphanteau du PHP | 23 Messages

17 août 2005, 22:54

Bonjour,

Je souhaite faire ceci en une seule requete :

SELECT documentId FROM keywords WHERE keyword = '$keyword';

=> cette requete doit me retourner l'ID des 5 ou 6 documents répondant au mot clé xxx

Ensuite pour chacun de ces ID, je souhaite récupérer

SELECT auteur, titre, dateCreation FROM documents WHERE id = '$id'

=> le but étant d'afficher une table avec les infos des documents (titre, auteur, date, ...) qui répondent au mot clé xxxx

Actuellement je le fais en deux fois gérant cela avec php, mais je suis sur qu'il est possible de faire ça en une seule requete.

Merci beaucoup de votre aide, et bonne soirée.

PS : je souhaite faire quelque chose de très optimisé car les requêtes sont exécutées en live grace à AJAX.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

17 août 2005, 23:20

une petite jointure devrait suffire :
$requete = "
SELECT auteur, titre, dateCreation FROM documents d 
INNER JOIN keywords k ON d.id = k.documentId
WHERE keyword = '".$keyword."'";

Eléphanteau du PHP | 23 Messages

17 août 2005, 23:24

Merci beaucoup, je vais essayer.

J'avoue que je ne comprends pas bien SQL :-)

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

17 août 2005, 23:34

là c'est simple
tu as tes deux tables documents et keywords, reliées par un champ id (clé primaire/clé étrangère)
tu veux les infos de l'une, correspondant aux critères de l'autre

donc dans le WHERE on filtre les lignes que l'on souhaite suivant un mot-clé
dans le SELECT on nomme les colonnes que l'on souhaite récupérer
et relie ces deux tables grâce à INNER JOIN et grâce aux deux champs "id" et "documentId"
INNER JOIN va dire que pour chaque ligne de la table documents qui a une ligne qui correspond dans la table keywords on prend, s'il n'y a pas de correspondance on ne prend pas
$requete = "
SELECT auteur, titre, dateCreation FROM documents d
INNER JOIN keywords k ON d.id = k.documentId
WHERE keyword = '".$keyword."'";
et comme tu le disais il est effectivement plus judicieux de faire un maximum de choses du coté du SGBD (récupération des requêtes, tri, filtrage...) car c'est beaucoup plus rapide
1 requête c'est mieux que 2 :)

Eléphanteau du PHP | 23 Messages

18 août 2005, 00:38

Merci de tes explications !

Je comprends un peu mieux, reste qu'il va falloir qu'un jour ou l'autre je me plonge dedans.
Mais comme j'arrive presque toujours à faire ce que je veux en passant par php, c'est beaucoup de boulot juste pour de l'optimisation...

Merci bonne soirée

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

18 août 2005, 08:56

Mais comme j'arrive presque toujours à faire ce que je veux en passant par php,
c'est beaucoup de boulot juste pour de l'optimisation...
:afraid:

On ne va pas lancer un débat philosophique, mais je suis persuadé que gérer une BD
plutôt que de tout confier à son code PHP est bien plus qu'une simple question d'optimisation... ;)

Pour construire une voiture, on ne dessine pas le moteur (et ses caractéristiques : puissance, etc.)
en fonction de la place disponible que laisse la carrosserie sous le capot... :langue:

ViPHP
pjl
ViPHP | 2119 Messages

18 août 2005, 13:34

Pour construire une voiture, on ne dessine pas le moteur (et ses caractéristiques : puissance, etc.)
en fonction de la place disponible que laisse la carrosserie sous le capot... :langue:
Et pourtant...............
V6 PRV. :wink:

Eléphanteau du PHP | 34 Messages

19 août 2005, 00:13

Je fais exactement la meme chose que Adoul actuellement ...

Ma question est de savoir si c'est vraiement optimisé de faire ca plutôt en 1 seule requête, qui devient forcement plus complexe, plutôt que 2 requête simples.

Les gains de performences sont ils existants ou nuls dans l'exemple que donne Adoul ?

Sinon pourquoi préférer cette méthode par rapport à l'autre ... bref je suis à la recherche d'arguments techniques (pas de voiture :p) qui puissent me convaincre de changer tout mon code ;)

merci d'avance

++

Mammouth du PHP | 19672 Messages

19 août 2005, 00:19

Une seule requête plus complexe et toujours plus performante que deux plus simple parce que ça limite surtout au niveau des échanges sur le réseau entre le client (PHP) et le serveur (SGBD). Le gain est parfois mineur et éventuellement de l'ordre de la miliseconde, mais multiplié par des centaines de requêtes sur un serveur mutualisé, ça finit par bouffer des ressources et ralentir les applications de tout le monde.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: