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

Contribuez MySQL Discussion :

La FAQ MySQL - commentaires & suggestions


Sujet :

Contribuez MySQL

  1. #41
    Rédacteur/Modérateur

    Bonjour,

    Merci de cette proposition.
    Nous sommes effectivement preneurs de toute contribution, notamment à la FAQ.
    L'avantage du forum, c'est que tout le monde peut réagir et ainsi compléter ta proposition initiale (notamment sur d'autres OS), jusqu'à obtenir une définition la plus précise possible.
    N'hésite donc pas à poster ta proposition de définition à la suite.

    Encore merci,

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  2. #42
    Membre habitué
    ok je vais essayer de rédiger une proposition donc.

  3. #43
    Membre à l'essai
    Je propose d'ajouter ce post dans la FAQ car il s'agit d'un problème classique sur lequel je ne trouvais pas de solution. Encore merci à Antoun et Oishiiii pour leur aide.

    La rédaction pourrait être la suivante :


    On cherche à lister les employés du service S1 qui n'ont pas suivi de formations en 2010.

    Les tables :
    - employes avec les champs : id_employe, nom, service
    - formations avec les champs : id_formation, formation, id_employe, annee

    La requête suivante fournit la liste les employés du service S1 qui n'ont jamais suivi de formations :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  e.nom, e.service, f.formation, f.annee
    FROM employes e
    LEFT JOIN formations f
    ON e.id_employe = f.id_employe
    WHERE f.formation IS NULL
    AND e.service = 'S1'


    La requête suivante fournit la liste les employés du service S1 qui n'ont pas suivi de formations en 2010 (compatible toutes versions) :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  e.nom, e.service, f.formation, f.annee
    FROM employes e
    LEFT JOIN formations f
      ON e.id_employe = f.id_employe AND  f.annee = '2010'
    WHERE f.formation IS NULL
    AND e.service = 'S1'


    La requête suivante fournit la liste les employés du service S1 qui n'ont pas suivi de formations en 2010 (compatible MySQL 4.1 et supérieures) :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT id_employe, nom
    FROM employes AS e
    WHERE service = 'S1'
    AND NOT EXISTS (
      SELECT *
      FROM formations AS f
      WHERE annee = '2010'
          AND f.id_employe = e.id_employe
    )


    Les exemples ci-dessus concernent des employés et des formations mais ils peuvent bien sûr être adaptés à tout type de cas.

  4. #44
    Nouveau Candidat au Club
    à propos du GROUP_CONCAT
    Bonjour, je lisais la FAQ sur la partie du GROUP_CONCAT
    je sais pas pour vous, mais chez moi la requête telle que proposée dans la FAQ ne fonctionne pas :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    GROUP_CONCAT(NOM_USER SEPARATOR ":" ORDER BY NOM_USER)


    en fait l'ordre des champs est dans le mauvais ordre, c'est bien :


  5. #45
    Membre émérite
    la 2e solution pour la question "que faire quand on a perdu son mot de passe" est cocasse.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  6. #46
    Rédacteur/Modérateur

    Oooops...
    Il y a effectivement une petite coquille dans le titre de la deuxième question.
    Merci de l'avoir signalée : je la corrige dans les plus brefs délais.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  7. #47
    Membre éclairé
    FAQ upsert
    Pour ne rien avoir trouvé sur l'upsert dans la FAQ, j'ai peut être mal cherché.

    Sinon, un petit ajout serait utile car il me semble que c'est un point plutôt classique pour les bdd.

    Je ne maitrise pas suffisamment SQL pour faire une proposition complète d'un panorama de solutions (insert/onduplicate key, replace, merge...), mais déjà avec le couple "insert/onduplicate key", ça serait déjà pas mal.

    Voir ce post en exemple possible.

  8. #48
    Rédacteur/Modérateur

    MySQL ne connaît ni MERGE, ni UPSERT.

    Il y a deux solutions, le REPLACE et le INSERT... ON DUPLICATE KEY UPDATE. Elles sont pas mal décrites dans mon post ici, qui pourrait servir de base à une entrée de FAQ :



    Tu as deux possibilités, qui supposent toutes les deux une clé primaire ou unique sur le nom.

    Si je suppose que ta table est comme ça :

    ta_table(nom UNIQUE KEY, couleur, taille) ;
    1) le REPLACE est une combinaison de DELETE et INSERT. Donc l'ordre suivant :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    REPLACE INTO ta_table (nom, couleur)
    VALUES ('toto', 'bleu') ;


    va insérer une ligne toto si elle n'existe pas déjà, ou bien supprimer la ligne toto existante et insérer la nouvelle ligne à la place. Dans ce dernier cas, l'info sur la taille, qui n'est pas dans la requête de remplacement, sera perdue.

    2) le ON DUPLICATE KEY permet de combiner un INSERT avec un UPDATE. Exemple équivalent :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO ta_table (nom, couleur)
    VALUES ('toto', 'bleu')
    ON DUPLICATE KEY UPDATE couleur = 'bleu'


    Avec les deux syntaxes, tu peux savoir ce qui s'est passé en regardant le myslq_affected_rows(). Si c'est 1, ça veut dire qu'il y a eu une insertion simple, si c'est 2, ça veut dire que la ligne existait déjà.
    http://www.developpez.net/forums/d10...e/#post5791766
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  9. #49
    Rédacteur/Modérateur

    Question : comment mettre à jour une table à partir des données issues d'une autre table ?
    Réponse : MySQL permet de faire des mises à jour à l'aide de jointures dans la commande UPDATE, selon la syntaxe suivante :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE table1 t1
    INNER JOIN table2 t2 ON condition_de_jointure
    SET t1.une_colonne = une_nouvelle_valeur
    WHERE conditions_de_restriction

    La nouvelle valeur peut être issue d'une colonne de table2.
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

###raw>template_hook.ano_emploi###