Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème de jointure

    18 novembre 2010 à 9:11:08

    Bonjour tout le monde.
    Je réalise un espace membre en php et j'ai besoin de faire une jointure de table (je préciserai pourquoi après), seulement, j'ai vraiment du mal avec la syntaxe de cette notion alors ma console (je fais mes tests en console) me dit que j'ai des erreurs de syntaxe.
    Alors explication du problème :
    j'ia des membres qui sont reconnus par un ID (clef primaire), et dont j'ai enregistré la date de la "dernière vue" des messages personnels.
    J'ai une autre table qui contient les messages personnels, ID (primaire), idSender(clé étrangère->user), idReceiver(clé étrangere->user) , message et SendDate
    Mon but est de savoir s'il y a eu des messages depuis la dernière visite du membre, je fais donc ça :

    SELECT COUNT(mess.message) AS nbMessage FROM messagerie mess INER JOIN u user ON mess.idReceiver=u.id AND mess.sendDate>u.lastView
    

    la console me revoie l'erreur :
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INER JOIN u user ON mess.idReceiver=u.id AND mess.sendDate>u.lastView' at line 1

    merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      18 novembre 2010 à 9:35:46

      INNER avec 2 N

      Et faut donner l'alias d'une table après la table, donc INNER JOIN user u as INER JOIN u user.

      Par ailleurs, user est pas un bon nom pour une table puisque c'est un mot réservé. Mets plutôt member par exemple.
      • Partager sur Facebook
      • Partager sur Twitter
        18 novembre 2010 à 9:44:10

        ok, comment on fait pour changer le nom de la table?
        sinon, j'ai essayé :
        SELECT COUNT(mess.message) AS nbMessage FROM messagerie mess INNER JOIN user u ON mess.idReceiver=u.id AND mess.sendDate>u.lastView
        

        et j'ai :
        ERROR 1054 (42S22): Unknown column 'mess.message' in 'field list'
        • Partager sur Facebook
        • Partager sur Twitter
          18 novembre 2010 à 9:46:23

          Ca veut dire que tu n'as pas de colonne message dans mess...

          Et pour changer le nom de la table, je suis pas sûre qu'y ait moyen en fait. Je pense que le plus simple est de recréer une table, transférer les lignes puis effacer user.
          • Partager sur Facebook
          • Partager sur Twitter
            18 novembre 2010 à 18:18:40

            effectivement (j'avais pas vu), mon champs c'est "corps"...
            m'enfin pour ce que ça change : j'obtiens "2" en résultat : problème, seul un champ a été inséré dans la table.
            • Partager sur Facebook
            • Partager sur Twitter
              18 novembre 2010 à 20:01:57

              T'es sûr à 200% qu'y a qu'une ligne dans la table ?? La requête a l'air bonne donc y a des chances que l'erreur vienne de toi.
              • Partager sur Facebook
              • Partager sur Twitter
                18 novembre 2010 à 20:29:49

                parole de console :
                mysql> SELECT * FROM messagerie
                    -> \g
                +----+---------------------+----------+------------+---------------+-------+
                | id | sendDate            | idSender | idReceiver | corps         | titre |
                +----+---------------------+----------+------------+---------------+-------+
                |  1 | 2010-11-18 08:52:44 |        2 |          1 | bravo le veau | joli  |
                +----+---------------------+----------+------------+---------------+-------+
                1 row in set (0.08 sec)

                EDIT
                Ah, en fait, le problème vient plus ou moins de moi quand même
                SELECT COUNT(mess.corps) AS nbMessage FROM messagerie mess INNER JOIN user u ON mess.idReceiver=u.id AND mess.sendDate>u.lastView
                


                mer renvoie 1
                SELECT COUNT(mess.corps) AS nbMessage FROM messagerie mess INNER JOIN user u ON mess.idReceiver=1 AND mess.sendDate>u.lastView
                
                mer renvoie 2
                • Partager sur Facebook
                • Partager sur Twitter
                  18 novembre 2010 à 21:45:26

                  C'est normal, dans le premier cas tu fais une jointure, dans le deuxième un produit cartésien.

                  Si tu veux sélectionner les messages où idReceiver = 1, tu dois rajouter une clause WHERE.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 novembre 2010 à 21:58:54

                    ok, je vois pas pourquoi je fais un produit carthésien (sans compter que je mets select count(mess.corps)
                    sinon, j'avais effectivement remarqué qu'en mettant Where (ou AND) idReceiver=1, ça fonctionnait.
                    merci de votre aide.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 novembre 2010 à 22:01:21

                      Le COUNT n'y change rien, cette fonction ne fait que compter les lignes après le produit cartésien fait.

                      En gros, c'est parce que dans ta deuxième requête, tu n'as aucune condition de jointure. Tu sélectionnes les lignes où l'id est égal à 1 et mess.sendDate > u.lastView, mais après, le SGBDR ne sait pas quoi faire avec cette jointure. Donc il fait un produit cartésien : il colle chaque ligne de la table messagerie avec chaque ligne de la table user qui respecte la condition.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 novembre 2010 à 22:08:46

                        effectivement, vu comme ça je fais effectivement un produit carthésien.
                        je commence seulement à comprendre tout ça...
                        merci de ta patience.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        problème de jointure

                        × 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