J'ai une table MySQL qui doit être retirée sous forme de fichier csv, la requête que j'ai utilisée est
SELECT "ID","NAME","SALARY","SAL1","SAL2","SAL3","SAL4","SAL5","SAL6","SAL7","SAL8","SAL9","SAL10","SAL11","SAL12","SAL13","SAL14","SAL15","SAL16","SAL17","SAL18","SAL19","SAL20","SAL21","SAL22","SAL23","SAL24","SAL25","SAL26"
UNION ALL
SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
Cette requête fonctionne, que se passe-t-il si j'ai 200 noms de colonne? Existe-t-il un moyen de le faire sans le taper manuellement?
Cette commande vous donne presque ce que vous voulez, et elle fonctionne même avec un serveur distant. La seule mise en garde est qu'il génère un fichier TSV (les champs sont séparés par un onglet).
mysql mydb -e "select * from mytable" -B > mytable.tsv
Mais vous pouvez le convertir en CSV en utilisant sed, comme suggéré dans cette réponse
mysql mydb -e "select * from mytable" -B | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > mytable.csv
DESCRIBE addstock25;
Retirez la première colonne et les 3 premières entrées de cette colonne (cela dépend de votre utilisation). Vous obtiendrez la liste des champs dans addstock25.
Cela n'apportera que des noms de champ utilisant des tables virtuelles dérivées du noyau ... appelé schéma d'information.
SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_NAME`='foo';
Disons que le nom de cette requête serait sq_fieldnamelist
Ainsi, la table ci-dessus a une colonne et elle a les noms de champ de la table "foo".
Si écrivez directement comme ceci
SELECT (sq_fieldnamelist)
UNION ALL
SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n
Mysql donnera une erreur. "la sous-requête renvoie plusieurs lignes"
Nous devons modifier sq_fieldnamelist pour concattre toutes les entrées dos à dos séparées par des virgules.
Select GROUP_CONCAT(COLUMN_NAME)
FROM
(SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_NAME`='ffd_companies'
LIMIT 3,100
) AS fafa
GROUP BY 'COLUMN_NAME' // this group by is just to make group concat work
Disons que c'est sq_fieldnamelist2
Si nous modifions sq_fieldnamelist comme ceci. Il renverra seulement une valeur qui est tous les noms de champ séparés par des virgules. Alors maintenant, nous pouvons mettre cette sous-requête dans votre instruction select pour acquérir les champs nécessaires.
SELECT (sq_fieldnamelist2)
UNION ALL
SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n
Vous devez modifier LIMIT 3,100 dans sq_fieldnamelist2 pour votre propre usage.
disons que votre table est comme fil1, fil2 ... filN, sal1, sal2, sal3 ...., salI pour voir les seuls champs de salaire que vous devez utiliser LIMIT N,x>I+N
. si vous voulez voir tout utiliser LIMIT 0,x>N+I
Je ne vois pas pourquoi tu ne peux pas faire
SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n
?
J'ai intégré le script pour un code simple basé sur l'interface utilisateur. Ici, vous pouvez saisir une requête et obtenir simplement le fichier csv contenant toutes les lignes, y compris les noms de colonne.
Ce script fonctionne pour les systèmes Windows et Linux.
https://github.com/Bihari12/databasetocsv
Cela enregistrerait le résultat dans un fichier csv dans le même dossier dans lequel le code existe.
Je pense que vous cherchez quelque chose comme ça.
SET @sql = NULL;
SELECT GROUP_CONCAT("'",COLUMN_NAME,"'")
FROM
(SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA` = 'yourdatabasename'
and `TABLE_NAME`='ffd_companies'
) AS colnames
GROUP BY 'COLUMN_NAME'
into @sql;
SET @sql = concat ("SELECT", @sql, " from dual
UNION ALL
SELECT *
FROM addstock25
INTO OUTFILE 'E:\\JOSE DATA\\addstock7.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '", '"',"'
)"
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
J'espère que cela vous aidera.
Remarque: j'ajoute la clause WHERE TABLE_SCHEMA
= 'votre nom de base de données'