{MySQL} Optimisation Requete

Fermé
Xandler - 26 août 2009 à 13:17
moderno31 Messages postés 872 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 8 août 2012 - 1 sept. 2009 à 11:27
Bonjour à tous,

J'ai un soucis avec une requête qu'il faudrait que j'optimise :

Je dispose de 6 tables dans lesquelles se trouvent des infos que je souhaiterais rassembler en se focaliser sur la clé primaire de la table principale : users

- tables : users, users_bookings, purchases, users_addresses, users_optins, bookings

- Ma requete :

SELECT a.id, a.email, a.phone, a.gender, a.firstName, a.lastName, d.address1, d.address2, d.address3, d.zip, d.city, d.city, d.country, c.wsbooking, c.price, e.newsletter
FROM `users` a, `users_bookings` b, `purchases` c, `users_addresses` d, `users_optins` e, `bookings` f
WHERE a.id = b.user
AND b.booking = c.booking
AND f.wsstatus LIKE '%FINAL%'


J'ai besoin de votre aide pour optimiser cette requête car elle doit compter environ 15000 résultats mais PhpMyAdmin plante avant de pouvoir la terminer, j'ai beau sectionner le nombre de résultats, je n'arrive pas à tout récupérer.

Merci d'avance pour votre aide et dites moi si vous avez besoin de plus de précisions.
A voir également:

7 réponses

moderno31 Messages postés 872 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 8 août 2012 92
27 août 2009 à 05:50
hello, déjà si tu veux optimiser utiliser des jointure inner ou left join pas çà AND b.booking = c.booking
ensuite as-tu essayé d'indexer ton champ f.wsstatus (pour faire ton like il vaudrait mieux)
0
sofbylka Messages postés 8 Date d'inscription lundi 20 juillet 2009 Statut Membre Dernière intervention 1 septembre 2009
27 août 2009 à 14:05
aidez moi SVP:

j'ai créé 5 tables:

la première table (nom du personnel) est composée de deux champs (id_pers; Nom_pers)

les autres tables ont les mêmes champs ( id_action; nom_action; temps_action) et le nom de chaque table reprend le Nom_personne de la première table créée

Mon Problème:

je veux afficher dans un tableau (Résultat) pour chaque personne de ma première table la liste des actions qu'il a fait le temps pour chaque action... etc

en gros je veux affiché pour chaque ligne (Nom_personne) de ma première table les colonnes de la table correspendante

Merci pour votre aide
0
moderno31 Messages postés 872 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 8 août 2012 92
27 août 2009 à 14:10
Tu as lu ma réponse au moins ?
Déjà je ne vois pas de lien entre les 2 tables dans la structure que tu avances.

Pour faire simple je voudrais voir le code SQL de structure des tables en question...
Parce que si j'ai bien compris, tu te baseras que table nom du personnel pour ainsi récupérer des infos dans table des actions.. non ?
0
sofbylka Messages postés 8 Date d'inscription lundi 20 juillet 2009 Statut Membre Dernière intervention 1 septembre 2009
27 août 2009 à 15:35
je viens de lire ta réponse,

c'est exactement ce que je veux faire me basé sur nom du personnel pour pour récupérer les infos

Ps: je suis vraiment nouveau dans les base de données

Merci pour ton aide moderno
0
moderno31 Messages postés 872 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 8 août 2012 92
27 août 2009 à 15:45
ok d'acc
tu esq nouveau alors suis ce que je te dis :
Peux-tu stp me faire voir ce que tu as monté comme structure (struc de tables liées à ton souci) dans mysql.
Tu fé un export des tables (il me faut le code sql de création sans les données ou une copie d'écran)
Parce que avant de regarder coté programme déjà s'assurer que coté BD tout est nikel.

Please lol
0
sofbylka Messages postés 8 Date d'inscription lundi 20 juillet 2009 Statut Membre Dernière intervention 1 septembre 2009
28 août 2009 à 10:48
salut Moderno;

voila donc j'ai exporter la base espérant que cela va t'aider et encore Merci pour Ton aide

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- phpMyAdmin SQL Dump
-- version 3.1.1
-- https://www.phpmyadmin.net/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
moderno31 Messages postés 872 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 8 août 2012 92
29 août 2009 à 19:47
ouaw, c'est compliqué d'aider sur un forum..
Heuu, comment te dire.

Je constate que les tables malik, jean, et steeven ont la meme structure normal ?
Elles ont juste des données différentes.

Si tu veux lier toutes ces tables entre elles il te faut par exemple faire une table de lien (si tu as une multi-jointure de tables à faire).

Entre 2 tables tu t'assures que les Id contienent bien les mêmes données puis tu jointes par LEFT JOIN TABLE_A ON TABLE_A.ID = TABLE_B.ID

Attention aux jointures ternaires.

Qu'est ce que
champ = `DeviationAct` ?
table = `nompersonnels` ? --> On retrouve l'intitulé de tables !

Désolé de répondre si tard, avant j'ai pas pu.
0
sofbylka Messages postés 8 Date d'inscription lundi 20 juillet 2009 Statut Membre Dernière intervention 1 septembre 2009
31 août 2009 à 11:23
salut moderno ça ne marche pas!!!!

dis moi y' a- t-il moyen avec mysql de mettre le même identifiant pour chaque table je m'explique par exemple pour la table malik toutes les actions auront le même ID (1); et pour la table steven je mets(2) .....etc comme ça avec une clause where ou left join il est plus facile de retrouver le résultat

Merci
0
moderno31 Messages postés 872 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 8 août 2012 92
31 août 2009 à 14:40
Hello hello,
honettement, je ne comprends plus ce que tu veux faire.
Ta structure est confuse, franchement elle me parle pas
L'identifiant est unique par ligne de table pas poour une table. Sauf besoins particuliers de gestion.
0
sofbylka Messages postés 8 Date d'inscription lundi 20 juillet 2009 Statut Membre Dernière intervention 1 septembre 2009
1 sept. 2009 à 09:57
oui je voulais dire un ID unique pour les lignes de la table, dis-moi est -il possible de faire un INNER JOIN ou un LEFT JOIN pour plusieurs tables en même temps si c'est oui peux tu Me dire comment l'écrire en fait j'ai fait un test avec INNER JOIN pour deux tables Ça marche, mais plus je ne sais pas comment faire Ça
0
moderno31 Messages postés 872 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 8 août 2012 92
1 sept. 2009 à 11:27
Ok, oui tu peux
Je fais un exemple avec 4 tables
Ventes (id_vente, id_client, id_produit, date_vente..)
Clients (id_client,id_rib, nom, prenom, ville, n°compte)
Type de produit(id_famille_produit,famille,date_creation..)
Produits(id_produit, Id_type_produit,designation, date achat)

Je veux connaitre la facture des commandes qu'on effectué mes clients en aout 2009 (faire apparaitre le nom, prénom, produit)

SELECT Ventes.id_vente,Clients.nom, Clients.prenom,Produits.designation
FROM  Ventes
LEFT JOIN Clients ON Clients.id_client = Ventes.id_client
LEFT JOIN Produits ON Produits.id_produit = Ventes.id_produit
WHERE MONTH(Ventes.date_vente) = 8
AND YEAR(Ventes.date_vente) = 2009


NB
Ventes est une table de production (source originale de l'information) on appelle ça une table de fait (indicateurs)
Toutes les autres sont des tables de dimension (références fixes) elles servent à compléter l'information source
: tu viens d'apprendre quelques notions de décisionnel lol

Et voila
J'espère qu'il n'y a pas d'erreur.
0