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.
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 ?
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
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 ?
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 */;
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
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` );
Intéressante cette notion de temps timestamp, merci encore
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.
N'oubliez pas d'activer les erreurs PDO.