IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Probleme requete selection


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 91
    Par défaut Probleme requete selection
    Voici le schéma de mes tables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    #
    # Structure de la table `inscrits`
    #
     
    CREATE TABLE `inscrits` (
      `id` int(11) NOT NULL auto_increment,
      `lang` varchar(5) NOT NULL default '',
      `type` varchar(10) NOT NULL default '',
      `nom` varchar(255) NOT NULL default '',
      `prenom` varchar(255) NOT NULL default '',
      `email` varchar(255) NOT NULL default '',
      `login` varchar(10) NOT NULL default '',
      `pass` varchar(255) NOT NULL default '',
      `titre` varchar(50) NOT NULL default '',
      `societe` varchar(255) NOT NULL default '',
      `departement` varchar(50) NOT NULL default '',
      `adresse` varchar(255) NOT NULL default '',
      `cp` varchar(50) NOT NULL default '',
      `ville` varchar(255) NOT NULL default '',
      `etat` varchar(255) NOT NULL default '',
      `pays` varchar(255) NOT NULL default '',
      `tel` varchar(255) NOT NULL default '',
      `mobile` varchar(50) NOT NULL default '',
      `fax` varchar(255) NOT NULL default '',
      `nuits_offertes` int(11) NOT NULL default '1',
      `fkey_hotels` int(11) NOT NULL default '0',
      `type_chambre` varchar(100) NOT NULL default '',
      `datebox` varchar(11) NOT NULL default '0',   === date  arrivée à l’hotel 
      `dateboxR` varchar(11) NOT NULL default '0', = date de départ de l’hotel
      `nombre_nuits` int(11) NOT NULL default '0',
      PRIMARY KEY  (`id`)
    ) TYPE=MyISAM AUTO_INCREMENT=1053 ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #
    # Contenu de la table `contingent`
    #
     
    CREATE TABLE `contingent` (
      `code` int(3) NOT NULL default '0',
      `j2` int(3) NOT NULL default '0',    => 2 janvier
      `j3` int(3) NOT NULL default '0', => 3 janvier
      `j4` int(3) NOT NULL default '0', => 4 janvier
      `j5` int(3) NOT NULL default '0', => 5 janvier
      `j6` int(3) NOT NULL default '0', => 6 janvier
      `j7` int(3) NOT NULL default '0', => 7 janvier
      `j8` int(3) NOT NULL default '0', => 8 janvier
      `j9` int(3) NOT NULL default '0', => 9 janvier
      `j10` int(3) NOT NULL default '0', => 10 janvier
      `j11` int(3) NOT NULL default '0', => 11 janvier
      PRIMARY KEY  (`code`)
    ) TYPE=MyISAM;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #
    # Structure de la table `hotels`
    #
     
    CREATE TABLE `hotels` (
      `id_hotel` int(11) NOT NULL auto_increment,
      `nom_hotel` varchar(200) NOT NULL default '',
      `categorie` varchar(200) NOT NULL default '',
      `prix` varchar(200) NOT NULL default '',
      PRIMARY KEY  (`id_hotel`)
    ) TYPE=MyISAM AUTO_INCREMENT=5 ;
    A partir de ces données, il faut que je sorte des stats du style :

    Hotel 01/01 02/01 03/01 04/01 05/01 06/01
    Hotel 1 : 7 9 10 5 8 10 16 4 15 6 10
    Hotel 2 : 8 7 7 4 5 8 10 5 7 8 4
    Hotel 3 : 5 6 7 2 0 8 7 5 14 10 11
    ou les chiffres du tableau représente les chambres vendues
    Mon probleme est que dans ma table inscrit je stocke uniquement la date arrivée et date de départ.
    Je peux donc connaître le nombre de chambre vendu le jour de la date arrivée et le jour de la date départ, mais je n’arrive pas à trouver le nombre de chambre vendu entre des 2 dates.

    Quelqu’un a-t-il une idée ?

    Merci d’avance

  2. #2
    Membre Expert
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Par défaut
    Bonjour,

    Comment sont représentés les jours de la table contigent ?

  3. #3
    Membre éclairé Avatar de 12_darte_12
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2005
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Transports

    Informations forums :
    Inscription : Février 2005
    Messages : 212
    Par défaut
    As-tu penser a la fonction count() pour comper tout tes enregistrement entre ces deux dates?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 91
    Par défaut
    En fait j'ai fais ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    <? for ($i=2;$i<12;$i++)
    {
     
    $sql="SELECT fkey_hotels, count( * ) as Total
    FROM inscrits
    WHERE $i
     BETWEEN LEFT(datebox,2) AND LEFT(dateboxR,2)
    AND fkey_hotels = $valz[id_hotel]
    AND rempli_total='2'
    GROUP BY fkey_hotels
    $rez=mysql_query($sql);
    $val=mysql_fetch_array($rez);
     
    etc ...
    Mais je sais pas si elle est vraiment optimale ?

    ON remarque donc que ma table contingent ne me sert a rien ...
    S'agit il de la meilleure solution ?

  5. #5
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut Re: Probleme requete selection
    Un truc qui est assez terrible:

    Citation Envoyé par mathieu77186
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE `inscrits` (
      (...)
      `datebox` varchar(11) NOT NULL default '0',   === date  arrivée à l’hotel 
      `dateboxR` varchar(11) NOT NULL default '0', = date de départ de 
       (...)
    Je suppose que la date est enregistrée sous la forme d'une chaine de caractères au format JJ/MM/AAAA. Tu comptes faire un STR_TO_DATE à chaque fois? Tu trouvais que le problème de départ était pas assez compliqué comme ça? T'as entendu parler du type "DATE"?

    Visiblement, pour toi, y'a que 2 types de données en MySQL: INT et VARCHAR !

    Tu faisais quoi avant de te mettre au MySQL, du COBOL?

    Sinon, ta requête n'est pas optimale (en fait, on a plusieurs requêtes, donc c'est pour ça que je dis que c'est pas optimal), mais si ça fait ce que tu veux, commence par ça et tu optimiseras après.

    Sinon, moi je croyais que tu cherchais une requête pour alimenter ta table contingent (pour éviter de lancer une requête bien lourde à chaque fois)
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 91
    Par défaut
    Bah help me pour trouver la requete qui alimente ... je suis preneur
    Pour la base ... je l'ais recupéré comme ca
    Et maintenant que c'est en prod... jpeux rien faire

  7. #7
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Citation Envoyé par mathieu77186
    Pour la base ... je l'ais recupéré comme ca
    Et maintenant que c'est en prod... jpeux rien faire
    Quand on me demande de réparer les con***ies des autres, je réponds: "je suis informaticien, pas maçon: je suis pas là pour essuyer les plâtres !"

    Citation Envoyé par mathieu77186
    Bah help me pour trouver la requete qui alimente ... je suis preneur
    Bon, j'ai un peu réfléchi à ton problème et voilà ce que j'ai fait:

    1) Tout d'abord, j'ai créé une table pour répertorier les dates pour lesquelles je veux un relevé (celles qui correspondent à tes j1, j2...):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE dates (
      jour DATE NOT NULL,
      PRIMARY KEY (jour)
    )

    2) J'alimente cette table avec les dates qui m'intéressent

    3) Je fais un requête un peu spéciale.

    Elle est constituée comme suit:
    - un produit cartésien entre les dates du relevé et les hotels (pour avoir toutes les combinaisons jour/hotel possibles)
    - à partir de l'ensemble obtenu, on fait une jointure de type LEFT OUTER JOIN sur les inscrits (comme ça, si il n'y a pas d'incrit dans un hotel ce jour là, ça renvoie NULL)
    - on fait un GROUP BY pour faire le COUNT (les NULL devienent 0)
    - on fait un ORDER BY sur les données qui nous intéressent

    Ce qui nous donne ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT hotels.id_hotel, dates.jour, COUNT(inscrits.fkey_hotels)
    FROM dates, hotels              # Le produit cartésien
     
    LEFT OUTER JOIN inscrits ON     # La jointure ouverte gauche
      hotels.id_hotel=inscrits.fkey_hotels
      AND
     
      dates.jour BETWEEN
            STR_TO_DATE(inscrits.datebox,  "%d/%m/%Y")
        AND STR_TO_DATE(inscrits.dateboxR, "%d/%m/%Y")
     
    GROUP BY hotels.id_hotel, dates.jour  # Le GROUP BY
    ORDER BY hotels.id_hotel, dates.jour  # Le ORDER BY
    Au final, j'obtiens ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     fkey_hotels   	  jour   	  nbChambres
    -------------------------------------------
    1  	2005-11-21  	2
    1 	2005-11-22 	2
    1 	2005-11-23 	2
    1 	2005-11-24 	2
    2 	2005-11-21 	1
    2 	2005-11-22 	1
    2 	2005-11-23 	1
    2 	2005-11-24 	1
    Comme ça, tu peux parcourir la table résultat comme suit: pour chaque hotel, pour chaque jour, tu as le nombre de chambres louées

    Si tu veux alimenter la table contingent, ça demande un peu de traitement

    4) Enfin, tu fais un "TRUNCATE dates" quand t'as fini pour vider la table

    Qu'est-ce que tu en penses?
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme requete selection
    Par rob1son76 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 17/03/2010, 10h40
  2. Probleme requete select
    Par cefanic dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 28/06/2007, 11h57
  3. probleme requete SELECT SUM
    Par Sophie2097 dans le forum Requêtes
    Réponses: 1
    Dernier message: 03/11/2006, 15h14
  4. probleme requete select avec 2 colonnes
    Par cricri45000 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/04/2005, 10h39
  5. problemes de performances avec les requetes select
    Par berry dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/07/2003, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo