Включить заголовки при использовании SELECT INTO OUTFILE? - PullRequest
104 голосов
/ 09 мая 2011

Можно ли как-то включить заголовки при использовании MySQL INTO OUTFILE?

Ответы [ 17 ]

1 голос
/ 05 сентября 2018

пример из таблицы базы данных с моим именем датчик с столбцами (идентификатор, время, единица измерения)

select ('id') as id, ('time') as time, ('unit') as unit
UNION ALL
SELECT * INTO OUTFILE 'C:/Users/User/Downloads/data.csv'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM sensor
0 голосов
/ 12 декабря 2015

Я писал свой код на PHP, и у меня возникли некоторые проблемы с использованием функций concat и union, а также я не использовал переменные SQL, как бы то ни было, вот мой код:

//first I connected to the information_scheme DB

$headercon=mysqli_connect("localhost", "USERNAME", "PASSWORD", "information_schema");

//took the healders out in a string (I could not get the concat function to work, so I wrote a loop for it)

    $headers = '';
    $sql = "SELECT column_name AS columns FROM `COLUMNS` WHERE table_schema = 'YOUR_DB_NAME' AND table_name = 'YOUR_TABLE_NAME'";
    $result = $headercon->query($sql);
    while($row = $result->fetch_row())
    {
        $headers = $headers . "'" . $row[0] . "', ";
    }
$headers = substr("$headers", 0, -2);

// connect to the DB of interest

$con=mysqli_connect("localhost", "USERNAME", "PASSWORD", "YOUR_DB_NAME");

// export the results to csv
$sql4 = "SELECT $headers UNION SELECT * FROM YOUR_TABLE_NAME WHERE ... INTO OUTFILE '/output.csv' FIELDS TERMINATED BY ','";
$result4 = $con->query($sql4);
0 голосов
/ 10 мая 2011

Я думаю, что если вы используете UNION, он будет работать:

select 'header 1', 'header 2', ...
union
select col1, col2, ... from ...

Я не знаю способа указания заголовков с синтаксисом INTO OUTFILE напрямую.

0 голосов
/ 09 декабря 2014
SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT ColName1, ColName2, ColName3
    FROM YourTable
    INTO OUTFILE 'c:\\datasheet.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' 
0 голосов
/ 30 июля 2014

На самом деле вы можете заставить его работать даже с ORDER BY.

Нужно просто немного поработать с оператором order by - мы используем оператор case и заменяем значение заголовка другим значением, которое гарантированно будет отсортировано первым в списке (очевидно, это зависит от типа поля и от того, сортировка ASC или DESC)

Допустим, у вас есть три поля: name (varchar), is_active (bool), date_something_happens (date), и вы хотите отсортировать вторые два по убыванию:

select 
        'name'
      , 'is_active' as is_active
      , date_something_happens as 'date_something_happens'

 union all

 select name, is_active, date_something_happens

 from
    my_table

 order by
     (case is_active when 'is_active' then 0 else is_active end) desc
   , (case date when 'date' then '9999-12-30' else date end) desc
0 голосов
/ 16 ноября 2018

Я хотел бы добавить к ответу, предоставленному Sangam Belose.Вот его код:

select ('id') as id, ('time') as time, ('unit') as unit
UNION ALL
SELECT * INTO OUTFILE 'C:/Users/User/Downloads/data.csv'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM sensor

Однако, если вы не настроили "secure_file_priv" в переменных, он может не работать.Для этого проверьте папку, установленную для этой переменной:

SHOW VARIABLES LIKE "secure_file_priv"

Вывод должен выглядеть следующим образом:

mysql> show variables like "%secure_file_priv%";
+------------------+------------------------------------------------+
| Variable_name    | Value                                          |
+------------------+------------------------------------------------+
| secure_file_priv | C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\ |
+------------------+------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

Вы можете либо изменить эту переменную, либо изменить запрос для выводафайл с указанием пути по умолчанию.

0 голосов
/ 02 ноября 2015

Вот способ динамически получать заголовки заголовков из имен столбцов.

/* Change table_name and database_name */
SET @table_name = 'table_name';
SET @table_schema = 'database_name';
SET @default_group_concat_max_len = (SELECT @@group_concat_max_len);

/* Sets Group Concat Max Limit larger for tables with a lot of columns */
SET SESSION group_concat_max_len = 1000000;

SET @col_names = (
  SELECT GROUP_CONCAT(QUOTE(`column_name`)) AS columns
  FROM information_schema.columns
  WHERE table_schema = @table_schema
  AND table_name = @table_name);

SET @cols = CONCAT('(SELECT ', @col_names, ')');

SET @query = CONCAT('(SELECT * FROM ', @table_schema, '.', @table_name,
  ' INTO OUTFILE \'/tmp/your_csv_file.csv\'
  FIELDS ENCLOSED BY \'\\\'\' TERMINATED BY \'\t\' ESCAPED BY \'\'
  LINES TERMINATED BY \'\n\')');

/* Concatenates column names to query */
SET @sql = CONCAT(@cols, ' UNION ALL ', @query);

/* Resets Group Contact Max Limit back to original value */
SET SESSION group_concat_max_len = @default_group_concat_max_len;

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
...