2014-04-01 120 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文件中的代碼中存在相同的文件夾中。