problème de requête

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : problème de requête

par auclairp. » 03 janv. 2008, 01:31

merci je regarde cela

par Sékiltoyai » 30 déc. 2007, 18:05

en tout cas jh'espère que ca aide a comprendre unpeu
Pas qu'un peu, justement.

Tout d'abord, en voyant tes shémas, je ne peux pas ne pas te conseiller des optimisations parce là tes tables sont plutôt mal faites.

Pour la table all_loan, les date_prets et date_retour semblent être des timestamp, donc devraient être stockés dans des champs entiers. Ou alors tu peux aussi remplacer ce champ par un champ de DATE qui te permet d'utiliser les nombreuses fonctions de date fournies par MySQL.

Pour la table description, je te conseillerais des champs TINYINT ou ENUM (selon les goûts) par exemple pour original, HDDVD ou encore disponible (video et sound, je ne sais pas ce que c'est…). Concernant les acteurs, tu gagnerais plus à faire une table à part pour indiquer quels acteurs sont sur tes films, par exemple une table regroupant les acteurs, et une table fesant la correspondance entre l'id de l'acteur et l'id (ou la référence) du film, parce que sur plus d'un film, tu auras je pense plus de 3 acteurs principaux…

Enfin, sur les deux tables, la très grosse majorité des champs de type text peuvent être retypés en champs VARCHAR, je pense déjà au code qui peut être typé en CHAR(6) (mais tu peux le mettre en VARCHAR puisque de toute façon avec ton shéma, MySQL le transformera en VARCHAR). Il n'y a que la description du film qui peut rester en text (puisque peut être elle peut dépasser 255 caractères…).

Applique des typages logiques pour toutes tes tables, et met des index sur les colonnes utilisées pour les recherches (en l'occurence est ce que tu ne peux pas mettre le code seulement dans la table description, et joindre à la table all_loan avec l'id du film et non son code)
Voir : http://dev.mysql.com/doc/refman/5.0/fr/data-size.html
Et : http://dev.mysql.com/doc/refman/5.0/fr/ ... types.html

Et concernant ton problème, il faudrait juste que tu expliques en détail comment s'organise la table all_loan (ce que tu mets dedans), si chaque code correspond bien à un seul DVD (et si le champ disponible est vraiment utile), et expliquer textuellement (c'est à dire sans parler d'enregistrements et de tables) qu'est ce que ta requète est sensé te renvoyer exactement

par auclairp » 30 déc. 2007, 16:03

OK voici ma table pour mieu comprendre

Code : Tout sélectionner

CREATE TABLE `all_loan` ( `id` int(11) NOT NULL auto_increment, `code` text NOT NULL, `user` text NOT NULL, `date_prets` text NOT NULL, `date_retour` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Liste de tous les films emprunter' AUTO_INCREMENT=31 ; -- -- Contenu de la table `all_loan` -- INSERT INTO `all_loan` VALUES (29, '000687', 'Mélanie Croteau', '1198990104', '1198990203'); INSERT INTO `all_loan` VALUES (28, '000687', 'En Attente', '1198989916', '1198990203'); INSERT INTO `all_loan` VALUES (30, '000687', 'Mélanie Croteau', '1198990508', ''); CREATE TABLE `description` ( `id` int(11) NOT NULL auto_increment, `code` text NOT NULL, `nom` text NOT NULL, `nomfr` text NOT NULL, `genre` text NOT NULL, `description` text NOT NULL, `video` text NOT NULL, `acteur1` text NOT NULL, `acteur2` text NOT NULL, `acteur3` text NOT NULL, `sound` text NOT NULL, `original` text NOT NULL, `HDDVD` text NOT NULL, `disponible` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=720 ; -- -- Contenu de la table `description` -- INSERT INTO `description` VALUES (718, '000687', 'Heartbreak Kid, The', 'Le brise-coeur', 'Comédie', 'Au cours de son voyage de noces au Mexique, un homme découvre avec consternation le caractère instable et capricieux de sa jeune épouse. N''y tenant plus, il se laisse aller à courtiser une autre jeune femme qui loge à son hôtel.', '', 'Ben Stiller', 'Michelle Monaghan', 'Jerry Stiller', '', 'copier', 'dvd', 'non');
Bon normalement l'enregistrement dan sdescription devrais apparaitre une seul fois, mais à chaque fois qu'elle est dans la table all_loan bien elle se répète..... comme en ce mement elle s'y trouve 3 fois, si le code n'est ne se trouve pas dans la table all_loan pas de trouble il y est qu'une seul fois.... mais j'ai besoin de lier les deux tables pour savoir si le CD est prèter ou pas alors je peux pas mettre limit 1 à la fin de ma requète ......

en tout cas jh'espère que ca aide a comprendre unpeu

par Sékiltoyai » 30 déc. 2007, 11:58

Est ce que tu peux donner un échantillon de données, la structure de la table (via export sus forme CREATE TABLE …) ainsi qu'un échantillon du résultat obtenu ?

par zeus » 30 déc. 2007, 11:50

Modération :
Afin d'obtenir plus de réponses, le sujet est déplacé dans le forum "SQL & Bases de données".

Merci de prendre le temps de lire les règlements
ainsi que l'intitulé de chaque forum avant de poster un nouveau sujet.

par Kaoteknik » 30 déc. 2007, 11:36

Je ne sais pas si ça peut fonctionner sur des tables reliées par jointure, mais en principe la clause DISTINCT permet de supprimer les doublons.

Par contre ton message n'est pas posté dans la bonne rubrique du forum. Etant donné que ta question porte sur le langage SQL, attend-toi à ce qu'il soit déplacé par un modérateur !

problème de requête

par auclairp » 30 déc. 2007, 06:37

J'ai un problème avec ma requête

Premièrement là voici
$sql = "SELECT all_loan.code, all_loan.user, all_loan.date_prets, all_loan.date_retour, description.code, description.nom, description.nomfr, description.genre, description.description, description.video, description.acteur1 ,description.acteur2, description.acteur3, description.sound, description.original, description.HDDVD 
FROM all_loan RIGHT JOIN description 
ON all_loan.code=description.code
WHERE description.code='$code'"; 
Les deux tables sont relié par le "code", mon problème est que lorsqu'il me donne le résultat, toute ma fiche se répète le nombre de fois que le champ "code" se trouve dans la table all_loan, pourquoi....

Merci.!!