Partage
  • Partager sur Facebook
  • Partager sur Twitter

Sous requête dans le where d'un update

Anonyme
    17 janvier 2019 à 16:45:37

    Bonjour à tous !
    J'étais tout content d'enfin comprendre et de commencer à sentir quand j'avais besoin des sous-requêtes.
    Alors je m'y essaye dans un UPDATE :

    UPDATE client_note AS cn SET cn.vu=1 WHERE cn.id_client=".$idclient." AND cn.id=(SELECT max(id) FROM client_note AS cn2 WHERE cn2.id_client=cn.id_client)

    Quand soudain :

    "You can't specify target table 'cn' for update in FROM clause"

    Bon, je regarde un peu et je crois comprendre qu'il faut comme créer une table virtuelle de transition ?
    Pourtant j'aimerais juste récupérer le plus gros id de ce membre dans cette table pour update la bonne ligne en mettant vu=1.
    Et là je ne comprend pas grand chose à la syntaxe, si vous auriez quelques minutes pour m'éclairer.

    Merci par avance !

    • Partager sur Facebook
    • Partager sur Twitter
      17 janvier 2019 à 17:03:33

      Salut,

      Il me semble que la clause AS est reservé aux SELECT.

      Ex :

      SELECT nom_client as nc 
      FROM Client

      Enleves simplement le AS et je pense que ca devrait fonctionner ^^

      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        17 janvier 2019 à 17:08:36

        Salut ! J'ai essayé ça ne change rien, et dans la sous requête non plus, d'ailleurs je ne peux plus différencier la requête de la sous requête sans ces alias :p

        Comment faire ?????? xD
        • Partager sur Facebook
        • Partager sur Twitter
          17 janvier 2019 à 17:19:11

          Tu obtiens le meme message d'erreur ?

          Tu exécutes ta requête depuis ton PHP ou depuis l'invite de commande de ton SGBD ?

          J'aimerai t'aider mais je ne sais pas ce que tu veux qu'elle fasse précisement ? Peux tu le ré-expliquer ? Et peut etre ajouter un petit schema (MCD ou MPD) de tes tables ? :)

          -
          Edité par earp91 17 janvier 2019 à 17:19:38

          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            17 janvier 2019 à 17:31:19

            Oui le même message d'erreur.
            J'execute la requête depuis un script php.

            J'ai une table client et une table client_note.

            Table client :

            id nom

            Table client_note :

            id id_client note vu


            Un client peut créer plusieurs notes. Ma table 'client_note' contient donc un champs id_client qui permet de faire la jointure avec ma table 'client'.

            Chaque note a un id unique (auto increment), et est attribuée à un client.
            Je veux mettre à 1 le plus gros id que possède l'id_client dans la table client_note

            Donc dans mon cas, si le client id_client =1 a 10 notes (id 1 à 10), je veux choper l'id 10 et mettre la valeur vu à 1.
            Ce que devrait faire ma requête, mais il semble que ça ne fonctionne pas dans un update et qu'il faille créer une table virtuelle qui va stocker les données avant de faire l'update ??

            En gros, je veux récupérer l'entrée

            • Partager sur Facebook
            • Partager sur Twitter
              17 janvier 2019 à 17:45:29

              Je vois mieux.

              J'ai crée des tables en local, fais un test, et cette requête marche : 

              UPDATE client_note  SET vu=1 WHERE id_client=1 AND id=(SELECT max(id) FROM client_note cn2 WHERE cn2.id_client=id_client)
              

              Cdlt,

              -
              Edité par earp91 17 janvier 2019 à 17:45:44

              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                17 janvier 2019 à 17:56:08

                Merci x)
                Bein je ne comprend pas du tout, cette requête ne fonctionne pas chez moi :'(

                "You can't specify target table 'client_note' for update in FROM clause"

                J'ai même rajouté le AS qui manquait mais ça n'a rien changé :x
                • Partager sur Facebook
                • Partager sur Twitter
                  17 janvier 2019 à 18:32:57

                  earp91 a écrit:

                  la clause AS est reservé aux SELECT

                  Non ... AS est utilisé pour définir un alias, pour un nom de colonne ou de table ou de sous-requête, ...

                  earp91 a écrit:

                  cette requête marche

                  Wow ... vraiment étrange ! Quel SGBD utilises-tu ?

                  harvox a écrit:

                  "You can't specify target table 'client_note' for update in FROM clause"

                  Oui MySQL ne sait pas modifier une table ET l'utiliser en même temps ...

                  J'ai une question, pourquoi vouloir stocker une données qui peut changer dans le temps (qu'il faudra tenir à jour), alors que tu peux la calculer chaque fois que tu en as besoin ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                  Anonyme
                    17 janvier 2019 à 19:27:56

                    Ha chouette j'ai perdu mon temps à chercher à faire quelque chose d'impossible. Ca aurait été drôle que j'y arrive 8-) ^^

                    "J'ai une question, pourquoi vouloir stocker une données qui peut changer dans le temps (qu'il faudra tenir à jour), alors que tu peux la calculer chaque fois que tu en as besoin ?"

                    Tu penses aux cookies en disant ça ? :)
                    Je t'avoue que je ne les aient jamais utilisés, j'ai pensé que ça pouvait être une solution.

                    EDIT qui n'en est pas un : J'ai passé ma variable en get et ça passe ;)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 janvier 2019 à 9:17:24

                      Benzouye a écrit:

                      earp91 a écrit:

                      la clause AS est reservé aux SELECT

                      Non ... AS est utilisé pour définir un alias, pour un nom de colonne ou de table ou de sous-requête, ...

                      earp91 a écrit:

                      cette requête marche

                      Wow ... vraiment étrange ! Quel SGBD utilises-tu ?

                      D'accord j'ai dis une betise pour le AS, merci de m'avoir corrigé :). Que ce soit en cours ou au taff j'avais l'habitude de n'utiliser cette clause que dans mes SELECT. Mon mauvais :)

                      Je suis sous SQL Server 2012 ou 2016 je ne sais plus. Je confirme qu'elle fonctionne.

                      @Benzouye : Font mal tes ptits points :(

                      -
                      Edité par earp91 18 janvier 2019 à 9:20:48

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 janvier 2019 à 14:58:43

                        harvox a écrit:

                        Tu penses aux cookies en disant ça ?

                        Pas du tout ... Là tu as créé une colonne dans la table clinet_note pour y stocker une valeur qui va changer dans le temps et que tu peux calculer facilement, donc tu n'as pas intérêt à stocker cette valeur dans la table, mais plutôt à la calculer chaque fois que tu en as besoin ...

                        Ce n'est pas une histoire de cookie, je ne vois d'ailleurs pas le rapport ...

                        Simplement, quand tu as besoin de connaître l'id de la dernière note pour un client, calcule le ... ne le stockes pas ... la valeur va changer prochainement de toute façon ...

                        earp91 a écrit:

                        @Benzouye : Font mal tes ptits points :(

                        Je ne comprends pas ... quels petits points ? Les 3 points de suspensions ?

                        earp91 a écrit:

                        Je suis sous SQL Server 2012 ou 2016 je ne sais plus. Je confirme qu'elle fonctionne

                        Benzouye a écrit:

                        MySQL ne sait pas modifier une table ET l'utiliser en même temps

                        Damned MySQL :p

                        -
                        Edité par Benzouye 18 janvier 2019 à 17:39:36

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                          18 janvier 2019 à 16:22:04

                          En fait, ta requête tourne mais je doute qu'elle fasse ce qu'on veut, notamment à cause du :

                          WHERE cn2.id_client=id_client

                          qui, à moins que je dise de la merde, est équivalent à un WHERE 1=1 ?

                          Sinon, si tu veux vraiment le faire (mais faut bien prendre en compte al remarque de Benzouye), tu peux toujours passer par une table temporaire :

                          CREATE TEMPORARY TABLE IF NOT EXISTS maxId AS (
                          	SELECT
                          	  MAX(id) AS id
                          	FROM client_note
                          	GROUP BY idClient);
                          
                          UPDATE cn
                          SET cn.vu = 1
                          FROM client_note AS cn
                          INNER JOIN maxId
                            ON maxId.id = cn.id
                          WHERE cn.id_client=".$idclient.";



                          -
                          Edité par Tiffado 18 janvier 2019 à 16:25:03

                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 janvier 2019 à 16:52:41

                            Tiffado a écrit:

                            En fait, ta requête tourne mais je doute qu'elle fasse ce qu'on veut, notamment à cause du :

                            WHERE cn2.id_client=id_client

                            qui, à moins que je dise de la merde, est équivalent à un WHERE 1=1 ?

                            Vérifions ensemble.

                            Ma table client :

                            Ma table client_note :

                            J'exécute cette requête :

                            UPDATE client_note  SET vu=1 WHERE id_client=1 AND id=(SELECT max(id) FROM client_note cn2 WHERE cn2.id_client=id_client)

                            Et de nouveau ma table client :

                            C'est peut-être une fonctionnalité SQL Server (le propriétaire à ses avantages face au libre ?), mais ca marche :)

                             En tout cas bon a savoir ce genre de nuances entre SGBD.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 janvier 2019 à 17:02:10

                              Dans ton cas, ton id max de toute ta table correspond justement avec l'id client que tu cherches. il se passe quoi si dans ton where tu te limite au client 2 ?

                              Je suis persuadé que ca ne fonctionne pas.

                              -
                              Edité par Tiffado 18 janvier 2019 à 17:02:59

                              • Partager sur Facebook
                              • Partager sur Twitter
                                18 janvier 2019 à 17:41:31

                                Le plus simple dans cette histoire, si l'on fait abstraction de l'absurdité de stocker cette valeur dans la table, c'est quand même de faire chaque INSERT avec la valeur vu=1 ... ainsi le dernier ID sera toujours à 1 ... mais du coup il le seront tous :p

                                D'où l'absurdité ...

                                earp91 a écrit:

                                le propriétaire à ses avantages face au libre ?

                                Je ne sais pas si c'est libre vs propriétaire ... PostGreSQL est libre est permet de faire cela ... même si cela n'a pas de sens :p

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                                  18 janvier 2019 à 17:54:51

                                  Benzouye a écrit:

                                  Le plus simple dans cette histoire, si l'on fait abstraction de l'absurdité de stocker cette valeur dans la table, c'est quand même de faire chaque INSERT avec la valeur vu=1 ... ainsi le dernier ID sera toujours à 1 ... mais du coup il le seront tous :p

                                  Dans ce cas, juste avant l'insertion, il faut tous les mettre à 0 ! Comme ca seul le dernier sera à 1.

                                  P'tet que sinon il ne veut pas faire son set au moment de l'insertion mais que au moment ou justement le client a vu sa note.

                                  -
                                  Edité par Tiffado 18 janvier 2019 à 17:55:02

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Sous requête dans le where d'un update

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown