Partage
  • Partager sur Facebook
  • Partager sur Twitter

Copie de données depuis une table différente sous

Sujet résolu
    21 août 2020 à 12:08:22

    je débute et souhaite faire des requêtes simples (changement de forum).
    je souhaite récupérer une donnée d'une table qui est dans un autre table d'une autre colonne à condition que les données de deux autres colonnes dans ces 2 tables soient identiques

    INSERT INTO bb4764z_posts (
    post_subject
    ) SELECT
        bb4764z_topics.topic_title
    
    FROM
    bb4764z_topics
    WHERE
        bb4764z_topics.topic_id = bb4764z_posts.topic_id



    Sauf que j'ai l'erreur quand j’exécute :
    MySQL a répondu :
    #1054 - Champ 'bb4764z_posts.topic_id' inconnu dans where clause


    Si je met entre guillemets bb4764z_posts.topic_id , ça s’exécute sans erreur mais forcement ça ne fait rien puisque la valeur bb4764z_posts.topic_id n'existe pas.

    Comment puis je faire ?
    • Partager sur Facebook
    • Partager sur Twitter
      23 août 2020 à 13:50:46

      Bonjour,

      Il faut revoir ton raisonnement, tu parles de récupérer "une donnée" mais ne vas*tu pas avoir plusieurs lignes concernées ?

      Pour commencer par le SELECT, il faut que tu fasses d'abord une jointure si tu veux utiliser deux tables...

      • Partager sur Facebook
      • Partager sur Twitter
        24 août 2020 à 9:41:11

        Bonjour,

        Oui bien sûr une donnée pour chaque ligne, cela va de soit.

        pour la jointure, dans mon cas :

        INSERT INTO bb4764z_posts (
        post_subject
        ) SELECT
            bb4764z_topics.topic_title
         
        FROM
        bb4764z_topics
        inner join bb4764z_topics ON bb4764z_posts.topic_id = bb4764z_topics.topic_id 


        mais du coup j'ai l'erreur :
        MySQL a répondu :
        #1066 - Table/alias: 'bb4764z_topics' non unique




        • Partager sur Facebook
        • Partager sur Twitter
          24 août 2020 à 18:04:20

          Bonjour,

          OlivierC.2 a écrit:

          je débute

          Donc on ne commence pas par courir ... mais par marcher ... là c'est déjà un niveau sensible que tu veux atteindre ...

          J'ai peur que tu t'avances vers de gros problèmes si tu continues à tâtons ainsi ...

          Peux-tu nous décrire un peu mieux les tables en jeu (nom, colonnes, types, clés et contraintes), et nous expliquer plus précisément ce que tu veux obtenir ?

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            25 août 2020 à 10:42:20

            Bonjour,

            Sur mon site suis en train de migrer d'un forum à un autre.
            je souhaite copier des données (ici topic_title de la deuxième table) dans post_subject de la première table ci dessous), mais uniquement lorsque que les 2 topic_id des 2 tables sont identiques

            Table bb4764z_posts
            <tr>
              <td>post_id</td>
              <td>topic_id</td>
              <td>forum_id</td>
              <td>post_time</td>
              <td>poster_id</td>
              <td>post_subject</td>
              <td>post_text</td>
            </tr>
            
            
            
            Table bb4764z_topics
            <tr>
              <td>topic_id</td>
              <td>forum_id</td>
              <td>topic_title/td>
              <td>topic_poster</td>
              <td>topic_time</td>
            </tr>


            -
            Edité par OlivierC.2 25 août 2020 à 10:49:00

            • Partager sur Facebook
            • Partager sur Twitter
              25 août 2020 à 10:53:57

              Une réponse brute serait par exemple :

              INSERT INTO bb4764z_posts ( post_subject, post_time )
              SELECT topic_title, topic_time
              FROM bb4764z_topics;

              Mais tu as là un risque ... Ton ancienne table (topics) et ta nouvelle (posts) ont toutes les deux des clés étrangères (forum_id, topic_poster, topic_id, etc.). Il te faut d'abord mettre ces données en cohérence avant toute chose.

              Si tu veux insérer des données dans la table posts, que vas-tu mettre dans les colonnes topic_id, forum_id et poster_id ? Rien ?

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                25 août 2020 à 11:30:35

                Les autres données sont déjà présentes, hormis _time... (mais là on verra plustard)

                Ta requête semble bonne mais comment rajouter la condition des 2 topic_id des 2 tables identiques ?

                • Partager sur Facebook
                • Partager sur Twitter
                  25 août 2020 à 12:16:16

                  Je ne comprends pas...

                  Peux-tu me donner un exemple de données dans les deux tables et ce que tu voudrais que la requête fasse ?

                  OlivierC.2 a écrit:

                  hormis _time... (mais là on verra plustard)

                  Bah non, si tu insères il faut tout faire d'un coup sinon ça ne va pas le faire ...

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    26 août 2020 à 15:04:11

                    Bonjour,

                    pas facile à expliquer :

                    Alors je  je souhaite copier les données topic_title de la table bb4764z_topics dans post_subject de la table bb4764z_posts, mais uniquement lorsque que les 2 topic_id des 2 tables sont identiques parce que certaines ligne de la table bb4764z_posts n'ont pas de topic_id équivalent (ce qui est normal dans ma base et la structure du forum)

                    Concernant la valeur _time, pour les 2 tables, est à récupérer dans une autre table, old_forum_posts, donnée date, en fonction de l'ID qui doit être égale à la valeur de topic_id pour la table bb4764z_topics et égale à la valeur post_id pour la table bb4764z_posts (mais où la date est sous un autre format pour les 2 _time de destination, au lieu d'avoir la date dans le format date, il faut en plus la convertir au format int? du genre 1597837663)

                    -- phpMyAdmin SQL Dump
                    -- version 5.0.1
                    -- https://www.phpmyadmin.net/
                    --
                    -- Hôte : localhost:3306
                    -- Généré le : mer. 26 août 2020 à 13:01
                    -- Version du serveur :  5.7.25
                    -- Version de PHP : 7.4.1
                    
                    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
                    SET AUTOCOMMIT = 0;
                    START TRANSACTION;
                    SET time_zone = "+00:00";
                    
                    
                    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
                    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
                    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
                    /*!40101 SET NAMES utf8mb4 */;
                    
                    --
                    -- Base de données : `test2`
                    --
                    
                    -- --------------------------------------------------------
                    
                    --
                    -- Structure de la table `bb4764z_posts`
                    --
                    
                    CREATE TABLE `bb4764z_posts` (
                      `post_id` int(10) UNSIGNED NOT NULL,
                      `topic_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
                      `forum_id` mediumint(8) UNSIGNED NOT NULL DEFAULT '0',
                      `poster_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
                      `post_time` int(11) UNSIGNED NOT NULL DEFAULT '0',
                      `post_subject` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
                      `post_text` mediumtext CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL
                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
                    
                    --
                    -- Déchargement des données de la table `bb4764z_posts`
                    --
                    
                    INSERT INTO `bb4764z_posts` (`post_id`, `topic_id`, `forum_id`, `poster_id`, `post_time`, `post_subject`, `post_text`) VALUES
                    (10185, 10084, 811, 2, 0, '', 'Test');
                    
                    -- --------------------------------------------------------
                    
                    --
                    -- Structure de la table `bb4764z_topics`
                    --
                    
                    CREATE TABLE `bb4764z_topics` (
                      `topic_id` int(10) UNSIGNED NOT NULL,
                      `forum_id` mediumint(8) UNSIGNED NOT NULL DEFAULT '0',
                      `topic_title` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
                      `topic_poster` int(10) UNSIGNED NOT NULL DEFAULT '0',
                      `topic_time` int(11) UNSIGNED NOT NULL DEFAULT '0'
                    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
                    
                    --
                    -- Déchargement des données de la table `bb4764z_topics`
                    --
                    
                    INSERT INTO `bb4764z_topics` (`topic_id`, `forum_id`, `topic_title`, `topic_poster`, `topic_time`) VALUES
                    (10084, 811, 'test subject', 2, 0);
                    
                    -- --------------------------------------------------------
                    
                    --
                    -- Structure de la table `old_forum_posts`
                    --
                    
                    CREATE TABLE `old_forum_posts` (
                      `id` int(11) NOT NULL,
                      `text` longtext COLLATE utf8mb4_unicode_520_ci,
                      `parent_id` int(11) NOT NULL DEFAULT '0',
                      `forum_id` int(11) NOT NULL DEFAULT '0',
                      `date` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
                      `date_edit` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
                      `author_id` int(11) NOT NULL DEFAULT '0',
                      `author_edit` int(11) NOT NULL DEFAULT '0',
                      `uploads` longtext COLLATE utf8mb4_unicode_520_ci
                    ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
                    
                    --
                    -- Déchargement des données de la table `old_forum_posts`
                    --
                    
                    INSERT INTO `old_forum_posts` (`id`, `text`, `parent_id`, `forum_id`, `date`, `date_edit`, `author_id`, `author_edit`, `uploads`) VALUES
                    (10185, 'Test', 10184, 811, '2019-10-31 21:28:57', '1000-01-01 00:00:00', 2, 0, 'a:0:{}');
                    
                    --
                    -- Index pour les tables déchargées
                    --
                    
                    --
                    -- Index pour la table `bb4764z_posts`
                    --
                    ALTER TABLE `bb4764z_posts`
                      ADD PRIMARY KEY (`post_id`),
                      ADD KEY `forum_id` (`forum_id`),
                      ADD KEY `topic_id` (`topic_id`),
                      ADD KEY `poster_id` (`poster_id`),
                      ADD KEY `tid_post_time` (`topic_id`,`post_time`);
                    ALTER TABLE `bb4764z_posts` ADD FULLTEXT KEY `post_subject` (`post_subject`);
                    ALTER TABLE `bb4764z_posts` ADD FULLTEXT KEY `post_content` (`post_text`,`post_subject`);
                    ALTER TABLE `bb4764z_posts` ADD FULLTEXT KEY `post_text` (`post_text`);
                    
                    --
                    -- Index pour la table `bb4764z_topics`
                    --
                    ALTER TABLE `bb4764z_topics`
                      ADD PRIMARY KEY (`topic_id`),
                      ADD KEY `forum_id` (`forum_id`),
                      ADD KEY `forum_id_type` (`forum_id`),
                      ADD KEY `fid_time_moved` (`forum_id`),
                      ADD KEY `forum_vis_last` (`forum_id`),
                      ADD KEY `latest_topics` (`forum_id`);
                    
                    --
                    -- Index pour la table `old_forum_posts`
                    --
                    ALTER TABLE `old_forum_posts`
                      ADD PRIMARY KEY (`id`),
                      ADD KEY `parent_id` (`parent_id`),
                      ADD KEY `author_id` (`author_id`),
                      ADD KEY `date` (`date`),
                      ADD KEY `forum_id` (`forum_id`),
                      ADD KEY `forum_id_id` (`forum_id`,`id`),
                      ADD KEY `parent_id_id` (`parent_id`,`id`);
                    ALTER TABLE `old_forum_posts` ADD FULLTEXT KEY `text` (`text`);
                    
                    --
                    -- AUTO_INCREMENT pour les tables déchargées
                    --
                    
                    --
                    -- AUTO_INCREMENT pour la table `bb4764z_posts`
                    --
                    ALTER TABLE `bb4764z_posts`
                      MODIFY `post_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10186;
                    
                    --
                    -- AUTO_INCREMENT pour la table `bb4764z_topics`
                    --
                    ALTER TABLE `bb4764z_topics`
                      MODIFY `topic_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10085;
                    
                    --
                    -- AUTO_INCREMENT pour la table `old_forum_posts`
                    --
                    ALTER TABLE `old_forum_posts`
                      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10186;
                    COMMIT;
                    
                    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
                    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
                    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
                    



                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 août 2020 à 16:12:15

                      OlivierC.2 a écrit:

                      je souhaite copier les données topic_title de la table bb4764z_topics dans post_subject de la table bb4764z_posts, mais uniquement lorsque que les 2 topic_id des 2 tables sont identiques

                      Donc ce n'est une insertion (INSERT) mais une mise à jour (UPDATE) ... non ?

                      UPDATE bb4764z_posts P
                      	INNER JOIN bb4764z_topics T
                      		ON P.topic_id = T.topic_id
                      SET P.post_subject = T.topic_title;

                      Avec cette requête, tu METS A JOUR la colonne subject de la table posts avec la valeur de la colonne title de la table topics lorsque le lien existe ...

                      Si cela est correct, avec le même principe tu pourras mettre à jour la datetime évoquée ;)

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        27 août 2020 à 13:31:02

                        C'est parfait cela focntionne à merveille !!!!!

                        Pour datetime comment convertir ? parce que d'un coté elle en format date classique et de l'autre c'est... euh je ne sais pas en fait.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          27 août 2020 à 14:15:04

                          OlivierC.2 a écrit:

                          old_forum_posts, donnée date, en fonction de l'ID qui doit être égale à la valeur de topic_id pour la table bb4764z_topics et égale à la valeur post_id pour la table bb4764z_posts (mais où la date est sous un autre format pour les 2 _time de destination, au lieu d'avoir la date dans le format date, il faut en plus la convertir au format int? du genre 1597837663)

                          Le format de destination est un TIMESTAMP (un entier représentant le nombre de secondes écoulées depuis le 1er janvier 1970).

                          Donc il faut en effet convertir ton DATETIME en TIMESTAMP. Cela se fait aisément avec MySQL et sa fonction UNIX_TIMESTAMP().

                          Il faut faire 2 UPDATE, un par table de destination :

                          UPDATE bb4764z_topics T
                          	INNER JOIN old_forum_posts OP
                          		ON T.topic_id = OP.id
                          SET T.topic_time = UNIX_TIMESTAMP( OP.`date` );
                          
                          UPDATE bb4764z_posts P
                          	INNER JOIN old_forum_posts OP
                          		ON P.post_id = OP.id
                          SET P.post_time = UNIX_TIMESTAMP( OP.`date` );
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                            27 août 2020 à 14:35:36

                            Intéressante cette notion de temps timestamp, merci encore
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Copie de données depuis une table différente sous

                            × 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