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 :

COUNT() dans un INNER JOIN ne retourne aucune valeur


Sujet :

Requêtes MySQL

  1. #1
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut COUNT() dans un INNER JOIN ne retourne aucune valeur
    Bonjour,

    Je suis occupé d'optimiser mes requêtes en évitant de faire une 2me requête afin de connaître le nombre de valeurs (unique).
    Dès que j'ajoute un "COUNT(compta_dates_id) AS nbr_dates", la requête ne me donne plus aucune valeur.
    Je devrais peut-être également ajouter DISTNCT pour le COUNT pourles valeur uniques ? : "COUNT(DISTINCT(compta_dates_id)) AS nbr_dates"

    J'ai essayé le COUNT dans le 1er select ainsi que dans le INNER JOIN avec le même résultat.

    Voici mon code :

    Code PHP : 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
    	$reponse_bar = mysqli_query($conn_cecs, "SELECT compta_dates_id, compta_bar_type, compta_bar_vente_tva, compta_bar_vente_htva, compta_dates_date, compta_bar_prop_id, type_nom, compta_bar_compta_associe, compta_bar_compta, compta_bar_nbr, compta_bar_achat_tva, compta_bar_achat_htva, compta_bar_prod_id, compta_bar_date_id 
    		FROM 00_compta_bar AS bar 
    			INNER JOIN (SELECT *, COUNT(compta_dates_id) AS nbr_dates FROM 00_compta_dates) AS date ON bar.compta_bar_date_id=date.compta_dates_id 
    			LEFT JOIN 07_stock_produit AS prod ON bar.compta_bar_prod_id=prod.id_produit 
    			LEFT JOIN 07_stock_type AS type ON prod.id_type_prod=type.id_type 
    		WHERE compta_dates_date>='$cours_debut_select' && compta_dates_date<='$cours_fin_select' && compta_bar_type!='S' && compta_bar_date_id!=0 
    		ORDER BY compta_bar_compta_associe DESC, compta_bar_achat_tva, compta_bar_prod_id") or die(mysqli_error($conn_cecs));
    	while ($in_bar=mysqli_fetch_array($reponse_bar)) {
    		$nbr_dates=$in_bar['nbr_dates'];
    		$prod_date_id=$in_bar['compta_bar_date_id'];
    		$prod_id=$in_bar['compta_bar_prod_id'];
    		$prod_htva=$in_bar['compta_bar_achat_htva'];
    		$prod_htva_db=$in_bar['compta_bar_achat_htva'];
    		$prod_tva=$in_bar['compta_bar_achat_tva'];
    		$prod_nbr=$in_bar['compta_bar_nbr'];
    		$prod_compta=$in_bar['compta_bar_compta'];
    		$prod_compta_associe=$in_bar['compta_bar_compta_associe'];
    		$prod_nom=str_replace('_',' ',$in_bar['type_nom']);
    		$prod_prop_id=$in_bar['compta_bar_prop_id'];
    		$prod_date=$in_bar['compta_dates_date'];
    			$prod_date_fr=date("d/m/Y",strtotime($prod_date));
    		$prod_vente_htva=$in_bar['compta_bar_vente_htva'];
    		$prod_vente_tva=$in_bar['compta_bar_vente_tva'];
    		$prod_vente_type=$in_bar['compta_bar_type'];
     
    		// ----- Code de gestion
    	}

    J'ai beau rechercher sur le net une solution, rien ne fonctionne.

    Merci à ceux qui ont une idée de mon erreur.
    DDA

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 393
    Points
    9 393
    Par défaut
    Dans une requête , quand on a une sous-requête entre parenthèses, cette sous-requête doit être 'autonome'.
    Ici tu as dans tes parenthèses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT *, COUNT(compta_dates_id) AS nbr_dates FROM 00_compta_dates
    MySql accepte cette syntaxe, soit, faisons avec. Ce serait quand même mieux si MySQL refusait cette syntaxe, mais ce n'est pas le sujet. Cette requête est sensée renvoyer combien de lignes ? Si tu lances cette requête toute seule, elle renvoie quoi ?
    Je parle bien de cette requête toute seule.
    J'ai bien vu qu'ensuite, tu vas faire une jointure entre cette requête et le reste de ta requête, avec bar.compta_bar_date_id=date.compta_dates_id.

    A mon avis, tu devrais remplacer cette partie entre parenthèses par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT compta_dates_id, COUNT(compta_dates_id) AS nbr_dates FROM 00_compta_dates group by compta_dates_id
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  3. #3
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    A mon avis, tu devrais remplacer cette partie entre parenthèses par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT compta_dates_id, COUNT(compta_dates_id) AS nbr_dates FROM 00_compta_dates group by compta_dates_id
    Je reçois l'erreur suivante : Unknown column 'compta_dates_date' in 'field list'

    Si j'enlève le COUNT, le nombre de lignes de retour devrait être de 3 à 4.000 enregistrements si je prends toute cette année.
    Ce que je souhaite connaître est le nombre de "compta_dates_id" différents afin de connaître le nombre de jours d'ouverture.

    Mon code original était :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $reponse_bar = mysqli_query($conn_cecs, "SELECT compta_dates_id, compta_bar_type, compta_bar_vente_tva, compta_bar_vente_htva, compta_dates_date, compta_bar_prop_id, type_nom, compta_bar_compta_associe, compta_bar_compta, compta_bar_nbr, compta_bar_achat_tva, compta_bar_achat_htva, compta_bar_prod_id, compta_bar_date_id 
    		FROM 00_compta_bar AS bar 
    			INNER JOIN 00_compta_dates AS date ON bar.compta_bar_date_id=date.compta_dates_id 
    			LEFT JOIN 07_stock_produit AS prod ON bar.compta_bar_prod_id=prod.id_produit 
    			LEFT JOIN 07_stock_type AS type ON prod.id_type_prod=type.id_type 
    		WHERE compta_dates_date>='$cours_debut_select' && compta_dates_date<='$cours_fin_select' && compta_bar_type!='S' && compta_bar_date_id!=0 
    		ORDER BY compta_bar_compta_associe DESC, compta_bar_achat_tva, compta_bar_prod_id") or die(mysqli_error($conn_cecs));

  4. #4
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonjour
    Ce n'est pas une réponse directe à votre problème, mais pourquoi polluer votre question avec du php?
    Pour quelqu'un qui ne maîtrise pas php votre question est illisible.

    Pierre

  5. #5
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    Une question php ?
    J'espérais pouvoir compter le nombre de valeurs unique du champs "compta_dates_id" directement depuis ma requête Mysql.

    Pour des raisons de création d'ARRAY, j'ai du ordonner via d'autres champs que celui dont je doit connaître le nombre et cette valeur se retrouve dans un des ARRAY créé à la volée.

  6. #6
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonjour
    Peut-être.

    Mais le fait de mettre du php est vraiment dommageable.

    Présentez votre requête uniquement en MySql.

    Personnellement, j'ai du mal à comprendre votre requête et à savoir ce que vous voulez faire.

    Pierre

  7. #7
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 393
    Points
    9 393
    Par défaut
    La partie utile du code , c'est la requête. Comment tu lances cette requête, et le fait que tu mettes le résultat dans un Array, ou dans une chaîne, ou autre... ce n'est pas important.
    Peut-être même que si tu faisais comme ci-dessous, tu trouverais plus facilement ton erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    query = " select ... ... .. "
    echo (query)
    $reponse_bar = mysqli_query($conn_cecs, query) or die(mysqli_error($conn_cecs));
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 055
    Points
    19 055
    Par défaut
    Salut ddaweb.

    Plusieurs choses ne vont pas :

    1) essayez de vous exprimer dans un français correcte afin que nous puissions vous comprendre parfaitement, ce qui n'est pas le cas !

    2) ce forum est consacré exclusivement à MySql. Donc la fioriture php n'a pas lieu d'être et ne nous intéresse pas !

    3) si votre problème est en relation avec mysql et avec php, vous vous êtes trompé de forum.
    Vous auriez dû déposer votre sujet ici.

    4) présentez correctement votre requête afin que nous n'ayons pas un effort de lisibilité à faire.
    Voici une présentation lisible :
    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
    34
    35
    SELECT      compta_dates_id,
                compta_bar_type,
                compta_bar_vente_tva,
                compta_bar_vente_htva,
                compta_dates_date,
                compta_bar_prop_id,
                type_nom,
                compta_bar_compta_associe,
                compta_bar_compta,
                compta_bar_nbr,
                compta_bar_achat_tva,
                compta_bar_achat_htva,
                compta_bar_prod_id,
                compta_bar_date_id
          FROM  00_compta_bar AS bar
     
    INNER JOIN (SELECT  *,
                        COUNT(compta_dates_id) AS nbr_dates
                  FROM  00_compta_dates) AS date
            ON  bar.compta_bar_date_id  = date.compta_dates_id
     
     LEFT JOIN  07_stock_produit         AS prod
            ON  bar.compta_bar_prod_id = prod.id_produit
     
     LEFT JOIN  07_stock_type            AS type
            ON  prod.id_type_prod=type.id_type
     
         WHERE  compta_dates_date  >= '$cours_debut_select'
            &&  compta_dates_date  <= '$cours_fin_select'
            &&  compta_bar_type    != 'S'
            &&  compta_bar_date_id != 0
     
      ORDER BY  compta_bar_compta_associe DESC,
                compta_bar_achat_tva,
                compta_bar_prod_id
    5) évitez d'utiliser comme nom, des mots qui sont réservés. Par exemple, 'date', 'type'. Cela peut être source d'erreurs.
    Dans le cas des alias, vous pouvez utiliser une numérotation "t1", "t2", ...

    6) dans un select ayant plusieurs jointures, il est conseillé de rendre chaque colonne unique.
    Pour ce faire, vous devez préfixer vos colonnes par l'alias correspondant à la table dont elle est extraite.
    Même si chaque est unique dans votre base de données, cela rend votre requête plus lisible car on sait à quelle table elle est rattachée.

    7) en MySql, on ne met pas "&&" mais "and". Idem pour "!=", c'est plutôt "<>".

    8) n'utilisez pas le "select *" dans vos requête, ou sous-requête.
    Indiquez en tout lettre le nom des colonnes dont vous avez besoin et uniquement celles là !

    9) cette syntaxe n'est pas correcte, même si mysql la tolère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INNER JOIN (SELECT  *,
                        COUNT(compta_dates_id) AS nbr_dates
                  FROM  00_compta_dates) AS date
            ON  bar.compta_bar_date_id  = date.compta_dates_id
    La bonne écriture est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    LEFT JOIN (SELECT  compta_dates_id,
                       COUNT(*) AS nbr_dates
                 FROM  00_compta_dates
             GROUP BY  compta_dates_id) as date
           ON  bar.compta_bar_date_id  = date.compta_dates_id
    10) l'erreur suivante peut provenir du mauvais choix de votre table "00_compta_dates".
    Citation Envoyé par ddaweb
    Je reçois l'erreur suivante : Unknown column 'compta_dates_date' in 'field list'
    Nous ne pouvons pas vous aider à résoudre ce problème car nous ignorons le détail de vos tables.
    Soit cette colonne est absente de la table "00_compta_dates", soit il y a une erreur de retranscription.

    11) si vous avez besoin de récupérer d'autres colonnes de la table "00_compta_dates", vous devez ajouter une autre jointure, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INNER JOIN  00_compta_dates) AS compta
            ON  bar.compta_bar_date_id  = compta.compta_dates_id
    12) sans jeu d'essai, sans descriptif de vos tables, il est difficile de résoudre votre problème.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  9. #9
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    Bonjour Artemus24,

    Je te remercie pour les différentes remarques concernant les bonnes règles à utiliser.

    En effet, chaque nom de colonne est bien unique dans ma base de données, je normalise maintenant le nom de colonne en reprenant le nom de la table auquel j'y ajoute le nom de la colonne.
    Ex. : table = 00_compta_dates, chaque champs commencera par "compta_dates_" + nom de la colonne. Pour les anciennes tables, cela faisait vraiment beaucoup de travail pour appliquer la normalisation -> trop de pages à modifier, je me suis donc résigné à laisser le vieux tel quel et adopter la normalisation pour les nouvelles tables que je crée.
    J'ai ajouté des chiffres aux tables afin de les grouper par type de table : ex. "00_" c'est la comptabilité, "01_" c'est des données globales ... et "07_" pour le stock (utilisé dans ma requête)

    J'utilise "SELECT *" durant le développement de ma requête, une fois qu'elle me donne le rendu souhaité, je remplace "*" par la liste des champs que j'ai besoin comme c'est déjà au début de ma requête.

    Concernant le "&&" dans mes requêtes, avant je mettais "AND" et on m'a fait la remarque inverse de vous, personnellement je préférais "AND" que je trouve plus lisible.
    C'est comme le "||" pour "OR".

    Je pensais vraiment avoir été clair en disant "J'espérais pouvoir compter le nombre de valeurs unique du champs "compta_dates_id" directement depuis ma requête Mysql." et c'est à mon sens dans ce forum que je devais poster.
    Entre-temps, je l'ai fait en PHP, c'est moins élégant, mais j'ai le nombre souhaité.
    Juste pour voir éclairer, voici le code final que j'utilise actuellement :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    	$reponse_bar = mysqli_query($conn_cecs, "SELECT 
    			compta_dates_id, 
    			compta_bar_type, 
    			compta_bar_vente_tva, 
    			compta_bar_vente_htva, 
    			compta_dates_date, 
    			compta_bar_prop_id, 
    			type_nom, 
    			compta_bar_compta_associe, 
    			compta_bar_compta, 
    			compta_bar_nbr, 
    			compta_bar_achat_tva, 
    			compta_bar_achat_htva, 
    			compta_bar_prod_id, 
    			compta_bar_date_id 
    		FROM 00_compta_bar AS bar 
    		INNER JOIN 00_compta_dates AS dates ON bar.compta_bar_date_id=dates.compta_dates_id 
    		LEFT JOIN 07_stock_produit AS prod ON bar.compta_bar_prod_id=prod.id_produit 
    		LEFT JOIN 07_stock_type AS type ON prod.id_type_prod=type.id_type 
    		WHERE compta_dates_date>='$cours_debut_select' 
    			&& compta_dates_date<='$cours_fin_select' 
    			&& compta_bar_type!='S' 
    			&& compta_bar_date_id!=0 
    		ORDER BY compta_bar_compta_associe DESC, 
    			compta_bar_achat_tva, 
    			compta_bar_prod_id") or die(mysqli_error($conn_cecs));
    	while ($in_bar=mysqli_fetch_array($reponse_bar)) {
    		$nbr_dates=$in_bar['nbr_dates'];
    		$prod_date_id=$in_bar['compta_bar_date_id'];
    		$prod_id=$in_bar['compta_bar_prod_id'];
    		$prod_htva=$in_bar['compta_bar_achat_htva'];
    		$prod_htva_db=$in_bar['compta_bar_achat_htva'];
    		$prod_tva=$in_bar['compta_bar_achat_tva'];
    		$prod_nbr=$in_bar['compta_bar_nbr'];
    		$prod_compta=$in_bar['compta_bar_compta'];
    		$prod_compta_associe=$in_bar['compta_bar_compta_associe'];
    		$prod_nom=str_replace('_',' ',$in_bar['type_nom']);
    		$prod_prop_id=$in_bar['compta_bar_prop_id'];
    		$prod_date=$in_bar['compta_dates_date'];
    			$prod_date_fr=date("d/m/Y",strtotime($prod_date));
    		$prod_vente_htva=$in_bar['compta_bar_vente_htva'];
    		$prod_vente_tva=$in_bar['compta_bar_vente_tva'];
    		$prod_vente_type=$in_bar['compta_bar_type'];
     
    		// ---------- Nombre que je souhaitais obtenir directement depuis la requête
    		$array_nbr_jour[$prod_date_id][nbr]=$array_nbr_jour[$prod_date_id][nbr]+1;
    		$nbr_dates=count($array_nbr_jour);
    	}
    Si vous le souhaitez, je veux bien mettre le détail des différentes tables.

    @+

  10. #10
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 393
    Points
    9 393
    Par défaut
    Pour la ""normalisation"" des colonnes, je ne sais pas quelle est la norme officielle, mais j'aime nettement plus ce style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.cle ... ...
    from table1 a , table2 b
    where a.cle = b.cle
    Ca évite d'avoir des noms de colonnes à rallonge, et on sait parfaitement identifier de quelle table vient chasue colonne. En plus, pour des requetes comme celle ci-dessous, ça fonctionne parfaitement, alors que ta solution ne fonctionnne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.cle ... ...
    from table1 a , table1 b
    where a.cle = b.cle
    D'autre part, si je comprend bien, tu fais des additions dans la partie PHP, ( la ligne $array_nbr_jour[$prod_date_id][nbr]=$array_nbr_jour[$prod_date_id][nbr]+1; ). Dans cette ligne, je n'arrive vraiment pas à voir comment nbr erst initialisé, et cette ligne peut certainement être remplacée par un Count(...).
    En terme de performance, ton traitement ira 10 fois plus vite...

    Dernier point, dans ta requête, tu as plein de champs ( vente_tva, vente_htva, type_nom etc etc ...
    Quand tu poses une question, supprime toutes les variables inutiles (utiles pour toi, mais qui n'ont aucun impact sur la question). Plus tu simplifies la question, plus tu augmentes tes chances d'avoir une réponse efficace. Soit c'est toi qui fait l'effort de simplifier la question, soit les 10 personnes qui lisent ta question font cet effort...
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  11. #11
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 055
    Points
    19 055
    Par défaut
    Salut ddaweb.

    Citation Envoyé par ddaweb
    En effet, chaque nom de colonne est bien unique dans ma base de données, je normalise maintenant le nom de colonne en reprenant le nom de la table auquel j'y ajoute le nom de la colonne.
    Je n'aime pas les noms trop long, mais plutôt des noms courts et porteurs de sens. Pour vos tables, vous pouvez conserver vos noms actuels. Sur ce point, je rejoins l'opinion de tbc92 !

    Citation Envoyé par ddaweb
    Concernant le "&&" dans mes requêtes, avant je mettais "AND" et on m'a fait la remarque inverse de vous, personnellement je préférais "AND" que je trouve plus lisible. C'est comme le "||" pour "OR".
    Il faut se méfier car sur le net, beaucoup de conneries circulent. Même pire que cela, ils se copient les uns les autres sans aucune vérification de ce qui est colporté.
    Les '&&' et '||' sont les opérateurs 'AND' et 'OR' du langage 'C' ! Sous MySql, vous devez utilisez 'AND' pour le 'et logique' et 'OR' pour le 'ou inclusif logique'.

    Citation Envoyé par ddaweb
    Je pensais vraiment avoir été clair en disant "J'espérais pouvoir compter le nombre de valeurs unique du champs "compta_dates_id" directement depuis ma requête Mysql."
    La réponse se trouve dans mon paragraphe 9).
    Si vous n'obtenez aucune réponse, mais que vous désirez quand même obtenir le reste de l'extraction de votre requête, vous devez mettre "left outer join".
    Ensuite, vous devez faire un count(*) pour comptabiliser le nombre de lignes par valeur distincte de la colonne "compta_dates_id".
    Enfin, vous devez faire une jointure pour récupérer ce dont vous avez besoin.

    Pour votre requête, je vous l'ai déjà dit, nous n'avons pas besoin de la fioriture, mais juste la partie consacrée à MySql.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  12. #12
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    Bonsoir,

    Encore quelques infos utiles que j'ai reçue, merci à tbc92 et Artemus24.

    D'autre part, si je comprend bien, tu fais des additions dans la partie PHP, ( la ligne $array_nbr_jour[$prod_date_id][nbr]=$array_nbr_jour[$prod_date_id][nbr]+1; ). Dans cette ligne, je n'arrive vraiment pas à voir comment nbr erst initialisé, et cette ligne peut certainement être remplacée par un Count(...).
    En terme de performance, ton traitement ira 10 fois plus vite...
    Durant la requête de plus de 6.000 résultats (estimée à plus de 10.000 sur 1 an et en augmentation ... avec la possibilité de faire plusieurs années ), j'enregistre un tableau multidimensionnel avec comme référence la date ID : à chaque fois que cette ID apparait, le nombre est implémenté de 1. En comptant ensuite le nombre de ligne du résultat final du tableau j'obtiens le nombre de jours différents. La première entrée de chaque date initialise la ligne du tableau.
    Comme le PHP semble plus performant, je vais laisser ainsi.

    Ma requête fonctionne très bien, c'était juste avec l'ajout du "COUNT", je n'obtenais plus aucun résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.cle ... ...
    from table1 a , table1 b
    where a.cle = b.cle
    Zut, zut et zut .... là encore c'était comme cela que je faisais au début, le conseil a été d'utiliser les jointures pour une performance accrue ... je ne sais pas si ma méthode a augmenté les performances car je suis passé de PHP 5.3 à PHP 7.x au même moment, PHP 7.x va nettement plus vite (avec le soucis de tout passer de mysql à mysqli) : j'ai donc bien remarqué une accélération des pages -> jointures ou upgrade PHP ?, ou bien les deux ?
    L'utilisation de jointure "LEFT" et "RIGHT" m'a certes permis de diminuer le nombre de requêtes consécutives en les regroupant en une seule.

    Je n'aime pas les noms trop long, mais plutôt des noms courts et porteurs de sens.
    En effet c'est idéal, mais avec 64 tables (en augmentation avec des développements constants) cela devient assez difficile de trouver des noms courts (je le faisais au début avec quelques tables), d'où ma normalisation et la création de groupes. Cela vaut ce que cela vaut, mais je m'y retrouve assez bien de la sorte.

    Pourquoi autant de tables ? : la base de données de notre ASBL gère à peu près tout ... les membres, les chiens, les moniteurs, les abonnements, les horaires pour le site global internet et un affichage dans notre local, les présences, la comptabilité (avec tous les codes utilisés par notre comptable), les inscriptions aux différents concours, les mails de rappel, etc ... un mini SAP quoi (pour ceux qui connaissent).

    La réponse se trouve dans mon paragraphe 9).
    Désolé, je n'avais pas tilté, en effet je pourrais tester, mais il semble que ma solution en PHP serait plus performante.

    Bien à vous,
    ddaweb

  13. #13
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 393
    Points
    9 393
    Par défaut
    Je ne suis pas spécialiste en architecture, mais je doute que la solution : 'récupérer plein de données et faire les additions dans php' soit plus performante.

    Dans une configuration classique, tu as un serveur basé à un endroit x, et un client qui lance une requête, à un endroit y. Et ce qui coûte ( en temps, en argent...) c'est entre autre le transfert de données. Si tu transfères 1000 enregistrements, pour faire au final une addition de ces 1000 nombres, ou si tu fais l'addition sur le serveur, puis tu transfères un seul enregistrement, contenant le résultat de l'addition, tu transfères 1000 fois moins d'octets dans un cas que dans l'autre. Et donc tu vas 1000 fois plus vite.

    Comme dit le proverbe : chacun son métier, et les vaches seront bien gardées. Les calculs doivent être faits par le SGBDR.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  14. #14
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Juste un détail...
    Citation Envoyé par tbc92 Voir le message
    Pour la ""normalisation"" des colonnes, je ne sais pas quelle est la norme officielle, mais j'aime nettement plus ce style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.cle ... ...
    from table1 a , table2 b
    where a.cle = b.cle
    Les jointures s'écrivent depuis 1992 avec l'opérateur JOIN ; il serait temps de s'y mettre !

    Par contre, effectivement, des noms de colonne plus courts aident à la compréhension de la requête.
    Pour ma part, j'utilise une norme de nommage personnelle inspirée de celle de SQLPro. Exemple...

    Pour une table issue d'une entité type du modèle conceptuel de données et représentant une personne : te_personne_prs (prs_id, prs_nom...)
    - "te" signifie que la table est issue d'une entité-type du MCD (ce sera th pour une table héritant d'une autre, tj pour une table issue d'une association [tj : table de jointure]...);
    - "prs" est un trigramme mnémotechnique pour "personne" : ce que représente l'entité-type devenue table. Chaque trigramme est unique.
    - Chaque colonne de la table commence par le trigramme de la table où se trouve la colonne.

    Et dans une requête avec jointure, surtout s'il y a plus d'une jointure, je mets systématiquement un alias aux tables que j'utilise pour les colonnes dans toute la requête. Exemple...
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT r.rol_id roleId,
    	r.rol_code roleCode,
    	r.rol_libelle roleLibelle
    FROM th_utilisateur_uti u
    INNER JOIN ta_role_rol r ON r.rol_id = u.uti_id_role
    WHERE u.uti_id = 12
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Requete SQL - count dans un left join
    Par JbWillGetYou dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/06/2010, 01h07
  2. erreur de syntaxe dans mon inner join
    Par polo86 dans le forum Requêtes
    Réponses: 6
    Dernier message: 26/03/2009, 17h45
  3. [SQL] Selection du min dans un inner join
    Par elfiestador dans le forum Langage SQL
    Réponses: 0
    Dernier message: 05/12/2008, 12h02
  4. Nombre de clauses ON dans un INNER JOIN
    Par Shadow aok dans le forum Requêtes
    Réponses: 5
    Dernier message: 30/06/2004, 15h42
  5. count() dans *plusieurs* LEFT JOIN
    Par silver_dragoon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2004, 17h20

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