SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 05.02.2008 20:54:05

Nikolay
Участник
Зарегистрирован: 05.02.2008
Сообщений: 20

Экспорт из Exel

Есть прайс с остатками товара - в формате Exel (xls). Его нужно загрузить в MySQL таблицу в базе данных сайта. Подскажите, пожалуйста, как это правильно сделать.

Неактивен

 

#2 05.02.2008 21:33:35

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Экспорт из Exel

Экспортировать в CVS и загрузить в MySQL командой LOAD DATA INFILE.

Неактивен

 

#3 06.02.2008 12:17:37

Nikolay
Участник
Зарегистрирован: 05.02.2008
Сообщений: 20

Re: Экспорт из Exel

Спасибо. Сделал запрос, но почему-то вставило только одну строку, да еще и вместо тестовіх значений вопросительніе знаки ??????   Что посоветуете?
Запрос біл следующий:

LOAD DATA INFILE
'D:/Baza/sklad.csv'
    INTO TABLE medvest_polimed.dle_models (`connect`, `title`, `price`, `short_description`, `size`, `category`, `weight`, `description`);

Неактивен

 

#4 06.02.2008 13:01:23

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Экспорт из Exel

В какой кодировке Ваша таблица? В какой кодировке Ваше соединение? и в какой
кодировке данные в файле?

Таблицу нужно создавать в кодировке, поддерживающей русский язык, например,
utf8 или cp1251. При загрузке данных лучше указывать кодировку в явном виде
(у Вас не указана). Ну и, наконец, нужно сказать серверу, в какой кодировке работает
Ваш клиент командой SET NAMES.

Неактивен

 

#5 06.02.2008 14:10:13

Nikolay
Участник
Зарегистрирован: 05.02.2008
Сообщений: 20

Re: Экспорт из Exel

Кодировка - сp1251. Попытался изменить запрос

LOAD DATA INFILE
'D:/Baza/sklad.csv'
    INTO TABLE medvest_polimed.dle_models
    CHARACTER SET cp1251
    FIELDS TERMINATED BY ''
    (`connect`,
    `title`,
    `price`,
    `short_description`,
    `size`,
    `category`,
    `weight`,
    `description`);   

Стало выдавать ошибку
#1045 - Access denied for user 'medvest'@'localhost' (using password: YES)

Неактивен

 

#6 06.02.2008 14:10:38

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Экспорт из Exel

Еще обратите внимание, что excel по-умолчанию разделяет поля в cvs не запятой, а точкой с запятой

Неактивен

 

#7 06.02.2008 14:25:18

Nikolay
Участник
Зарегистрирован: 05.02.2008
Сообщений: 20

Re: Экспорт из Exel

А как это отобразить в запросе?

Неактивен

 

#8 06.02.2008 15:45:57

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Экспорт из Exel

Access denied - значит, не хватает прав. Для LOAD DATA INFILE нужно, чтобы
у пользователя была привилегия FILE. Можете воспользоваться, например, LOAD
DATA LOCAL INFILE, который будет читать файл с локального компьютера.

В запросе отразить - FIELDS TERMINATED BY ';'.

Неактивен

 

#9 06.02.2008 19:13:49

Nikolay
Участник
Зарегистрирован: 05.02.2008
Сообщений: 20

Re: Экспорт из Exel

Не могу справиться со следующей проблемой:
если указываю адрес файла на компьютере, выдает ошибку 1045 (нет прав доступа), если загружаю на хостинг - не видит файл и выдает ошибку 2. Пробовал загружать файл и в корневую хостинга и в папку домена и в папку temp - результат один. Что подскажете?

Неактивен

 

#10 06.02.2008 20:49:34

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Экспорт из Exel

На хостинге, скорее всего, у Вас нет права на чтение локальных файлов. На LOAD DATA LOCAL
INFILE, однако, это не должно никак влиять.

Как альтернативу могу предложить сделать это на локальном сервере, а потом экспортировать
данные в текстовый дамп, который потом загрузить на хостинге. Хотя, конечно, это уход от
проблемы, а не ее решение.

Неактивен

 

#11 06.02.2008 21:18:46

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Экспорт из Exel

[rgbeast@elf ~]$ perror 2
OS error code   2:  No such file or directory

Обратите внимание, что права должен иметь пользователь mysql. Попробуйте LOAD DATA LOCAL INFILE

Неактивен

 

#12 06.02.2008 23:13:42

Nikolay
Участник
Зарегистрирован: 05.02.2008
Сообщений: 20

Re: Экспорт из Exel

Пробовал по-разному - не хочет и все. Частично решил проблему через встроенный импорт phpMyAdmin.
Но там я могу всего лишь перечислить в какие столбцы таблицы что загружать, а мне надо еще и вычислять некоторые поля. А может это можно как-нибудь грамотно сделать через php?

Неактивен

 

#13 06.02.2008 23:50:19

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Экспорт из Exel

Вычислить поля можно после, средствами MySQL. Например
UPDATE tbl SET c = a+b;

Неактивен

 

#14 08.02.2008 14:25:32

Nikolay
Участник
Зарегистрирован: 05.02.2008
Сообщений: 20

Re: Экспорт из Exel

Возникла проблема при импорте из csv-файла. Грузит строк 70-100, а подом выдает ошибку о несоответствии числа полей. Смотрю визуально файл - ошибки не вижу. Таблица в файле из которого импорт содержит 8 столбцов, а та куда грузятся данные - 27. При импорте задаю 8 названий столбцов, куда и записываются данные из файла. К сожалению сам запрос воспроизвести не могу, так как делаю импорт через встроенный в phpMyAdmin.
Подскажите, может есть какие предположения что может быть не так и как это исправить.
Заранее благодарен.

Неактивен

 

#15 09.02.2008 16:54:19

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Экспорт из Exel

Быть может следующее: на 71-101 строке не хватает столбцов smile

При экспорте заключите данные в обязательные кавычки - будет легче найти
недостающие столбцы (как Вам, так и MySQL).

Неактивен

 

#16 14.02.2008 20:23:08

Nikolay
Участник
Зарегистрирован: 05.02.2008
Сообщений: 20

Re: Экспорт из Exel

Решил проблему следующим образом.
Скопировал нужную таблицу на локальный хостинг при помощи программы Sypex dumper. И через XAMPP локально запустил команду LOAD DATA LOCAL INFILE. Почему-то проблем с CSV файлом не возникло. Затем сделал дамп уже полной таблицы и вручную добавил на хостинге через phpMyAdmin (пришлось разбить файл на пять частей). По идее можно было залить обратно при помощи того же Sypex dumper, но сразу не подумал, а прежде чем переделівать решил проверить работоспособность базы.

Возникла следующая проблема.
В самом скрипте не предусмотрен импорт из файла, только ручной ввод, а данные о количестве товаров в той или иной группе записываются в другую таблицу. И соответственно при выводе определенной категории товаров, скрипт выдает только последнюю страницу списка, хотя многостраничный вывод в скрипте есть.

Подскажите, как правильно подсчитать количество записей в таблице по каждой категории, если в ней есть столбец, в котором хранится номер категории, чтобы потом это значение присвоить соответствующей ячейке из другой таблицы.

Заранее благодарен.

Отредактированно Nikolay (14.02.2008 20:26:17)

Неактивен

 

#17 14.02.2008 20:38:08

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Экспорт из Exel

SELECT `column_name`, count(*) FROM `table_name` GROUP BY `column_name`;

Неактивен

 

#18 15.02.2008 00:24:47

Nikolay
Участник
Зарегистрирован: 05.02.2008
Сообщений: 20

Re: Экспорт из Exel

Да, по этому запросу происходит выборка сколько записей соответствует каждому значению из стобца `category` в таблице `dle_models`.
А как теперь составить запрос, чтобы полученные значения (то есть количества записей) присваивались определенному столбцу 'models_num' в другой таблице 'dle_cat_catalog', а условием было соответствие значаения из колонки `dle_models`.`category` = `dle_cat_catalog`.`id`;

В моем представлении запрос должен был бы выглядеть так, но почему-то выдает ошибку.

UPDATE `dle_cat_catalog`, `dle_models`
SET `dle_cat_catalog`.`models_num` = count (*) FROM `dle_models` GROUP BY `category`
WHERE `dle_models`.`category` = `dle_cat_catalog`.`id`;

Пробовал и так

INSERT `dle_cat_catalog` (`models_num`) SELECT `category`, count(*) FROM `dle_models` GROUP BY `category` WHERE `dle_models`.`category` = `dle_cat_catalog`.`id`;

Тоже ошибка. Подскажите, что неправильно?
Спасибо.

Неактивен

 

#19 15.02.2008 01:42:50

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Экспорт из Exel

Во-первых, при использовании подзапроса его нужно брать в круглые скобки и естественно не забывать оператор SELECT.
Во-вторых, в операторе SELECT ключевые слова идут в строго определенной последовательности:
SELECT .. FROM .. WHERE .. GROUP BY .. HAVING .. ORDER BY .. LIMIT


В итоге получаем:

UPDATE `dle_cat_catalog`, `dle_models` SET `dle_cat_catalog`.`models_num` =
(SELECT count (*) FROM `dle_models` WHERE `dle_models`.`category` = `dle_cat_catalog`.`id` GROUP BY `category`);

Неактивен

 

#20 15.02.2008 12:04:51

Nikolay
Участник
Зарегистрирован: 05.02.2008
Сообщений: 20

Re: Экспорт из Exel

Попробовал, выдало ошибку

SQL-запрос: 

UPDATE `dle_cat_catalog` , `dle_models` SET `dle_cat_catalog`.`models_num` = ( SELECT count( * )
FROM `dle_models`
WHERE `dle_models`.`category` = `dle_cat_catalog`.`id`
GROUP BY `category` )

Ответ MySQL: 

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*)
FROM `dle_models`
WHERE `dle_models`.`category` = `dle_cat_catalog`.`id` ' at line 3

С чем это тожет быть связано? Как переделать запрос?

Неактивен

 

#21 15.02.2008 13:37:24

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Экспорт из Exel

А какая версия MySQL у Вас?

Если вариант с INSERT (а не UPDATE) Вас устроит, то можно переписать запрос в виде

INSERT INTO `othertable` (`column_name`, `count_column_name`)
SELECT `column_name`, count(*) FROM `table_name` GROUP BY `column_name`;

Но вариант с UPDATE тоже должен работать, если Вы нигде не опечатались, и у Вас версия
MySQL достаточно новая.

Неактивен

 

#22 15.02.2008 13:52:36

Nikolay
Участник
Зарегистрирован: 05.02.2008
Сообщений: 20

Re: Экспорт из Exel

Версия MySQL 5.0.45-community

Насчет опечаток. Проверял текст побуквенно, пытался менять поля идентификации, все тоже самое.

Сейчас попробую через INSERT.

Неактивен

 

#23 15.02.2008 14:09:25

Nikolay
Участник
Зарегистрирован: 05.02.2008
Сообщений: 20

Re: Экспорт из Exel

А такой запрос не испортит мне `othertable`.`column_name`, мне же результаты подсчетов количества строк нужно записывать в столбец `count_column_name`, а `column_name` - это столбец идентификации, содержащий такой же набор значений, как и `column_name`в `table_name`.

Неактивен

 

#24 15.02.2008 14:15:34

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Экспорт из Exel

Странно smile

Код:

mysql> create table dle_models (category int);
Query OK, 0 rows affected (0.09 sec)

mysql> create table dle_cat_catalog (id int, models_num int);
Query OK, 0 rows affected (0.66 sec)

mysql> UPDATE `dle_cat_catalog` , `dle_models` SET `dle_cat_catalog`.`models_num` = ( SELECT count( * )
    -> FROM `dle_models`
    -> WHERE `dle_models`.`category` = `dle_cat_catalog`.`id`
    -> GROUP BY `category` ) ;
Query OK, 0 rows affected (0.08 sec)
Rows matched: 0  Changed: 0  Warnings: 0

mysql> \s
--------------
mysql  Ver 14.12 Distrib 5.0.45, for pc-linux-gnu (x86_64) using readline 5.2

Неактивен

 

#25 15.02.2008 14:17:18

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Экспорт из Exel

Такой запрос добавит новые строчки. Если там уже есть строчки - он их оставит как есть.

UPDATE должен работать (см пример), видимо, Вы, все-таки, где-то опечатались.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson