merger 2 tables mysql

Modérateurs: Ligevum, Crepuscule, Wargaming, Okracoke, Simerion, Heroes, Bestiaire, Exsulare, terato, pentacle, Nainwak

merger 2 tables mysql

Messagepar Nico100 » 14 Oct 2010, 14:23

Salut,

J'ai un probleme pour merger le contenu de 2 tables mysql.

J'ai une table 'T':
Code: Tout sélectionner
Id    Param1    Param2    Criteria
-------------------------------------
1     A1        B         Red
2     A1        C         Blue
3     A1        D         Pink
4     A2        E         Red
5     A2        F         Blue
6     A2        G         Red
7     A3        H         Red


J'ai une table 'U':
Code: Tout sélectionner
Param1    Param3
-----------------
A1        11
A2        12
A3        13


Je voudrais les merger de maniere a obtenir une table 'X':
Code: Tout sélectionner
Param1    Param2Red     Param2Blue      Param2Pink    Param3
------------------------------------------------------------
A1        B             C               D             11
A2        E             F               G             12
A3        H             H               H             13


Le problème c'est la ligne A3 qui n'a pas toutes ses entrées dans la table T

Si j'utilise la requête:
Code: Tout sélectionner
select
         T1.Param1,
         T1.Param2,
         T2.Param2,
         T3.Param2,
         U.Param3
from
         T as T1,
         T as T2,
         T as T3,
         U
where
         T1.Param1 = U.Param1
and      T2.Param1 = U.Param1
and      T3.Param1 = U.Param1
and      T1.Criteria = 'Red'
and      T2.Criteria = 'Blue'
and      T3.Criteria = 'Pink'

ca marche bien pour A1 et A2, mais pas pour A3 qui évidemment ne renvoie pas de ligne!
Il me semble qu'il faut faire un 'LEFT JOIN' mais sur plusieurs tables et je n'y arrive pas...

.. merci pour votre aide.
Avatar de l’utilisateur
Nico100
 
Messages: 283
Inscription: 13 Avr 2004, 15:23

Messagepar izarie » 27 Oct 2010, 00:23

je crois que tu peux faire quelque chose du genre :
Code: Tout sélectionner
CREATE TABLE test AS (
SELECT *
FROM t1
LEFT JOIN t2
  ON t1.ext_id = t2.id
ORDER BY t1.cequetuveux
)


Normalement ca te créé la table avec le resultat de la requète et les colonnes du même type que les tables originales.

En espérant que ca puisse t'aider.
Avatar de l’utilisateur
izarie
Secrétaire de l'Association
 
Messages: 186
Inscription: 03 Juil 2005, 17:12

Messagepar izarie » 27 Oct 2010, 00:25

juste pour rajouter, a part si tu a VRAIMENT des problèmes de performance, je ne comprends pas trop ta démarche. Ton modèle SQL est plus correcte actuellement(pas de redondance d'informations).

Est ce que l'ajout d'un index ou l'optimisation à un autre endroit ne pourrait pas corriger ton problème de manière plus élégante ?
Avatar de l’utilisateur
izarie
Secrétaire de l'Association
 
Messages: 186
Inscription: 03 Juil 2005, 17:12

Messagepar Daimonos Tereutes » 04 Nov 2010, 17:39

Code: Tout sélectionner
SELECT T1.Param1, T1.Param2 AS Param2Red, T2.Param2 AS Param2Blue, T3.Param2 AS Param2Pink, U.Param3
FROM U
LEFT JOIN T AS T1 ON T1.Param1 = U.Param1
AND T1.Criteria = 'Red'
LEFT JOIN T AS T2 ON T2.Param1 = U.Param1
AND T2.Criteria = 'Blue'
LEFT JOIN T AS T3 ON T3.Param1 = U.Param1
AND T3.Criteria = 'Pink'

Ce qui donne :
Code: Tout sélectionner
Param1   Param2Red   Param2Blue   Param2Pink   Param3
A1      B         C         D       11
A2      E         F         NULL    12
A2      G         F         NULL    12
A3      H         NULL      NULL    13


si les NULL te gênent tu peux toujours les remplacer à l'aide de IFNULL()


Note : les 2 lignes en A2, c'est parcequ'il y a deux fois le couple (A2, Red), pour obtenir quelque chose de similaire à ton exemple il faudrait remplacer un Red par uin Pink dans ta table T.
Admin technique de nainwak.org
Daimonos Tereutes
Responsable Technique de l'Association
 
Messages: 926
Inscription: 30 Mar 2004, 18:39

Messagepar Nico100 » 09 Nov 2010, 19:45

merci,

T'as raison y'a une erreur dans mon message original
Avatar de l’utilisateur
Nico100
 
Messages: 283
Inscription: 13 Avr 2004, 15:23

Messagepar Nico100 » 06 Jan 2011, 10:07

Et comment faire pour updater une table avec ce contenu?
Avatar de l’utilisateur
Nico100
 
Messages: 283
Inscription: 13 Avr 2004, 15:23

Messagepar izarie » 09 Jan 2011, 18:10

je ne comprend pas trop ce que tu veux faire...
Avatar de l’utilisateur
izarie
Secrétaire de l'Association
 
Messages: 186
Inscription: 03 Juil 2005, 17:12

Messagepar Nico100 » 09 Jan 2011, 19:11

En fait j'ai une table avec des colonnes Param1, Param2, Param3
et une table avec Param1, Param4

Je voudrais créer une table avec Param1, Param2, Param3 et Param4

Merci
Avatar de l’utilisateur
Nico100
 
Messages: 283
Inscription: 13 Avr 2004, 15:23

Messagepar izarie » 09 Jan 2011, 20:02

Code: Tout sélectionner
CREATE TABLE test AS (
SELECT *
FROM t1
LEFT JOIN t2
  ON t1.ext_id = t2.id
ORDER BY t1.cequetuveux
)



Ca va te faire une table test avec tous les champs recopié depuis le resultat du select. A toi de mettre param1, 2 et 4 a la place de * dans le select
Avatar de l’utilisateur
izarie
Secrétaire de l'Association
 
Messages: 186
Inscription: 03 Juil 2005, 17:12

Messagepar Nico100 » 10 Jan 2011, 08:48

ok, j'avais cru comprendre que ca ne marchait pas avec mysql

Merci
Avatar de l’utilisateur
Nico100
 
Messages: 283
Inscription: 13 Avr 2004, 15:23

Messagepar Nico100 » 10 Jan 2011, 10:25

Si je fais ca je peux récupérer les champs de la table T1: Param1, Param2, Param3 mais pas ceux de T2 (en particulier Param4)... merci encore pour votre aide.
Avatar de l’utilisateur
Nico100
 
Messages: 283
Inscription: 13 Avr 2004, 15:23

Messagepar izarie » 12 Jan 2011, 22:20

Je viens de faire ca au boulot :
Code: Tout sélectionner

CREATE TABLE test AS (SELECT banned_words.target_id, words.word
FROM banned_words
JOIN words
ON word_id = words.id)


Aucun problè§me de mon coté.

Montre ta requete, il y a peut etre une erreur toute bete dedans.
Avatar de l’utilisateur
izarie
Secrétaire de l'Association
 
Messages: 186
Inscription: 03 Juil 2005, 17:12

Messagepar Nico100 » 13 Jan 2011, 09:27

Merci de ton aide.

Assurément y'a un probleme... mais je vous mets une version simplifiée de la requete que je veux faire! Personne ne se moque! :wink:

Code: Tout sélectionner
CREATE TABLE carte_test001 AS (
SELECT
   dc.id,
   mc.Wotc_Id_en,
   CAST(GROUP_CONCAT( IF( mc.Language LIKE "French", mc.Wotc_id, NULL ) ) AS UNSIGNED ) AS Wotc_Id_fr,
   CAST(GROUP_CONCAT( IF( mc.Language LIKE "Italian", mc.Wotc_id, NULL ) ) AS UNSIGNED ) AS Wotc_Id_it,
   CAST(GROUP_CONCAT( IF( mc.Language LIKE "Spanish", mc.Wotc_id, NULL ) ) AS UNSIGNED ) AS Wotc_Id_sp,
   CAST(GROUP_CONCAT( IF( mc.Language LIKE "Portuguese", mc.Wotc_id, NULL ) ) AS UNSIGNED ) AS Wotc_Id_po,
   CAST(GROUP_CONCAT( IF( mc.Language LIKE "German", mc.Wotc_id, NULL ) ) AS UNSIGNED ) AS Wotc_Id_de,
   CAST(GROUP_CONCAT( IF( mc.Language LIKE "Chinese_Standard", mc.Wotc_id, NULL ) ) AS UNSIGNED ) AS Wotc_Id_cs,
   CAST(GROUP_CONCAT( IF( mc.Language LIKE "Russian", mc.Wotc_id, NULL ) ) AS UNSIGNED ) AS Wotc_Id_ru,
   CAST(GROUP_CONCAT( IF( mc.Language LIKE "Japanese", mc.Wotc_id, NULL ) ) AS UNSIGNED ) AS Wotc_Id_jp,
   GROUP_CONCAT( IF( mc.Language LIKE "English", mc.Type, NULL ) ) AS Type,
   mc.CMC,
   mc.Name_en AS Nom,
   GROUP_CONCAT( IF( mc.Language LIKE "French", mc.Name, NULL ) ) AS Nom_fr,
   GROUP_CONCAT( IF( mc.Language LIKE "Italian", mc.Name, NULL ) ) AS Nom_it,
   GROUP_CONCAT( IF( mc.Language LIKE "Spanish", mc.Name, NULL ) ) AS Nom_sp,
   GROUP_CONCAT( IF( mc.Language LIKE "Portuguese", mc.Name, NULL ) ) AS Nom_po,
   GROUP_CONCAT( IF( mc.Language LIKE "German", mc.Name, NULL ) ) AS Nom_de,
   GROUP_CONCAT( IF( mc.Language LIKE "Chinese_Standard", mc.Name, NULL ) ) AS Nom_cs,
   GROUP_CONCAT( IF( mc.Language LIKE "Russian", mc.Name, NULL ) ) AS Nom_ru,
   GROUP_CONCAT( IF( mc.Language LIKE "Japanese", mc.Name, NULL ) ) AS Nom_jp,
   GROUP_CONCAT( IF( mc.Language LIKE "English", mc.Text, NULL ) ) AS Text,
   GROUP_CONCAT( IF( mc.Language LIKE "French", mc.Text, NULL ) ) AS Text_fr,
   GROUP_CONCAT( IF( mc.Language LIKE "Italian", mc.Text, NULL ) ) AS Text_it,
   GROUP_CONCAT( IF( mc.Language LIKE "Spanish", mc.Text, NULL ) ) AS Text_sp,
   GROUP_CONCAT( IF( mc.Language LIKE "Portuguese", mc.Text, NULL ) ) AS Text_po,
   GROUP_CONCAT( IF( mc.Language LIKE "German", mc.Text, NULL ) ) AS Text_de,
   GROUP_CONCAT( IF( mc.Language LIKE "Chinese_Standard", mc.Text, NULL ) ) AS Text_cs,
   GROUP_CONCAT( IF( mc.Language LIKE "Russian", mc.Text, NULL ) ) AS Text_ru,
   GROUP_CONCAT( IF( mc.Language LIKE "Japanese", mc.Text, NULL ) ) AS Text_jp,
FROM
   magicdeal.cartes mc
LEFT JOIN draft.cartes dc
   ON replace(mc.Name_en,' ','_') = dc.Nom
   AND mc.ed3 = dc.Edition
GROUP BY mc.Name_en, mc.ed3
ORDER BY mc.Name_en, mc.ed3
)
Avatar de l’utilisateur
Nico100
 
Messages: 283
Inscription: 13 Avr 2004, 15:23

Messagepar izarie » 13 Jan 2011, 16:10

Est ce que tu peux copier l'erreur stp ?

Au passage il y a une virgule a la fin du select, je pense parce que tu as allegé la requete non ?
Avatar de l’utilisateur
izarie
Secrétaire de l'Association
 
Messages: 186
Inscription: 03 Juil 2005, 17:12

Messagepar izarie » 13 Jan 2011, 16:12

De plus, dans ta requete tu n'utilise que les données venant de la table MC, pas dc... donc je ne comprend pas tres bien le soucis...
Avatar de l’utilisateur
izarie
Secrétaire de l'Association
 
Messages: 186
Inscription: 03 Juil 2005, 17:12

Suivante

Retourner vers Questions Pratiques/Techniques

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron