2014-04-01 123 views
18

我有,必须考虑作为一个CSV文件MySQL表,我使用的查询是导出MySQL表到CSV文件中

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 

此查询的工作,如果我有一个200个名? 有没有办法做到这一点,而无需手动输入?

+1

可能重复[MySQL转储到CSV文本文件的顶部列名?](http://stackoverflow.com/questions/4589891/mysql-dump-into-csv-text-files-with-column-名称在顶部) –

+0

带有--tab的mysqldump应该是这里的简单方法,不需要额外的脚本。我详细地写了[3种方法将MySQL转换为CSV](http://kedar.nitty-witty.com/blog/export-mysql-database-table-to-csv-delimited-excel-file)。 –

回答

4
DESCRIBE addstock25; 

删除该列的第一列和前3个条目(取决于您的使用情况)。你将得到addstock25中的字段列表。

这将仅使用派生于核心... ...称为信息模式的虚拟表的字段名称。

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_NAME`='foo'; 

比方说这个查询的名称将是sq_fieldnamelist

所以, 上面的表格有一列,它有个“富”表的字段名。

如果直接这样写

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将给出一个错误。 “子查询返回多行”

我们必须编辑sq_fieldnamelist以将所有条目背靠背连接,并用逗号分隔。

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 

比方说,如果我们编辑sq_fieldnamelist这样,这是sq_fieldnamelist2

。它将只返回一个值,它是所有用逗号分隔的字段名称。所以现在我们可以把这个子查询放到你的select语句中来获取所需的字段。

SELECT (sq_fieldnamelist2) 
UNION ALL 
SELECT * 
FROM addstock25 
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv" 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n 

您需要编辑sq_fieldnamelist2中的LIMIT 3,100以满足您的使用目的。

可以说你的表格就像fil1,fil2 ... filN,sal1,sal2,sal3 ....,salI看到你应该使用的唯一薪水字段LIMIT N,x>I+N。如果你想看到所有使用LIMIT 0,x>N+I

+0

我不能理解你在说什么....我想要的是从MySQL导出的csv文件,列名在第一行。 – user3304713

+0

给你一种方法来复制col名 - 有点自动 – tgkprog

+0

没有其他办法做到这一点? – user3304713

2

我没有看到你为什么不能做

SELECT * 
FROM addstock25 
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv" 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n 

+2

如果我这样做,我没有得到列名称...我有200列,所以我怎么能出口列名称? – user3304713

1

我认为你正在寻找这样的东西。

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; 

希望这可以帮助你。

注:我添加了WHERE子句TABLE_SCHEMA =“yourdatabasename”

+0

它给出了一个错误消息....我改变了数据库的名称....要做的任何其他更改? – user3304713

+0

任何想法,什么可能出错 – user3304713

+0

请托盘,并打电话给我,如果它的工作。 SET @sql = NULL; SELECT GROUP_CONCAT( “ '”,COLUMN_NAME, “'”) FROM(SELECT ' COLUMN_NAME' FROM'INFORMATION_SCHEMA'.'COLUMNS' WHERE'TABLE_SCHEMA' = 'yourdatabase' 和'TABLE_NAME' ='ffd_companies ')AS名称 GROUP BY'COLUMN_NAME'INTO @sql; SET @sql = CONCAT( “从双 工会从ffd_companies )所有( SELECT *” “SELECT”,@sql,); 准备来自@sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; –

38

这个命令几乎把你想要的东西,它甚至与远程服务器的工作原理。唯一需要注意的是,它会生成一个TSV文件(字段由选项卡分隔)。

mysql mydb -e "select * from mytable" -B > mytable.tsv 

但是你可以使用SED将其转换为CSV,如this answer

mysql mydb -e "select * from mytable" -B | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > mytable.csv 
+0

我可以使用where子句吗? – Lnux

+0

@Lnux是的,你可以使用where子句来缩小搜索范围,所有第一个带引号的区域都是select,是一个普通的数据库查询。 – Caperneoignis

+0

mysql -u root -p mydb -e“select * from mytable”-B | sed“s /'/ \'/; s/\ t/\”,\“/ g; s/^/\”/; s/$/\“/; s/\ n // g”> mytable。 csv - 这对我很好,谢谢 –

1

建议我已经集成了简单的用户界面基于代码的脚本。 在这里你可以输入查询,只需获取包含所有行的csv文件(包括列名)。

此脚本适用于Windows和Linux系统。

https://github.com/Bihari12/databasetocsv

这将结果保存在CSV文件中的代码中存在相同的文件夹中。