Задавайте вопросы, мы ответим
Вы не зашли.
Есть прайс с остатками товара - в формате Exel (xls). Его нужно загрузить в MySQL таблицу в базе данных сайта. Подскажите, пожалуйста, как это правильно сделать.
Неактивен
Экспортировать в CVS и загрузить в MySQL командой LOAD DATA INFILE.
Неактивен
Спасибо. Сделал запрос, но почему-то вставило только одну строку, да еще и вместо тестовіх значений вопросительніе знаки ?????? Что посоветуете?
Запрос біл следующий:
LOAD DATA INFILE
'D:/Baza/sklad.csv'
INTO TABLE medvest_polimed.dle_models (`connect`, `title`, `price`, `short_description`, `size`, `category`, `weight`, `description`);
Неактивен
В какой кодировке Ваша таблица? В какой кодировке Ваше соединение? и в какой
кодировке данные в файле?
Таблицу нужно создавать в кодировке, поддерживающей русский язык, например,
utf8 или cp1251. При загрузке данных лучше указывать кодировку в явном виде
(у Вас не указана). Ну и, наконец, нужно сказать серверу, в какой кодировке работает
Ваш клиент командой SET NAMES.
Неактивен
Кодировка - с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)
Неактивен
Еще обратите внимание, что excel по-умолчанию разделяет поля в cvs не запятой, а точкой с запятой
Неактивен
А как это отобразить в запросе?
Неактивен
Access denied - значит, не хватает прав. Для LOAD DATA INFILE нужно, чтобы
у пользователя была привилегия FILE. Можете воспользоваться, например, LOAD
DATA LOCAL INFILE, который будет читать файл с локального компьютера.
В запросе отразить - FIELDS TERMINATED BY ';'.
Неактивен
Не могу справиться со следующей проблемой:
если указываю адрес файла на компьютере, выдает ошибку 1045 (нет прав доступа), если загружаю на хостинг - не видит файл и выдает ошибку 2. Пробовал загружать файл и в корневую хостинга и в папку домена и в папку temp - результат один. Что подскажете?
Неактивен
На хостинге, скорее всего, у Вас нет права на чтение локальных файлов. На LOAD DATA LOCAL
INFILE, однако, это не должно никак влиять.
Как альтернативу могу предложить сделать это на локальном сервере, а потом экспортировать
данные в текстовый дамп, который потом загрузить на хостинге. Хотя, конечно, это уход от
проблемы, а не ее решение.
Неактивен
[rgbeast@elf ~]$ perror 2
OS error code 2: No such file or directory
Обратите внимание, что права должен иметь пользователь mysql. Попробуйте LOAD DATA LOCAL INFILE
Неактивен
Пробовал по-разному - не хочет и все. Частично решил проблему через встроенный импорт phpMyAdmin.
Но там я могу всего лишь перечислить в какие столбцы таблицы что загружать, а мне надо еще и вычислять некоторые поля. А может это можно как-нибудь грамотно сделать через php?
Неактивен
Вычислить поля можно после, средствами MySQL. Например
UPDATE tbl SET c = a+b;
Неактивен
Возникла проблема при импорте из csv-файла. Грузит строк 70-100, а подом выдает ошибку о несоответствии числа полей. Смотрю визуально файл - ошибки не вижу. Таблица в файле из которого импорт содержит 8 столбцов, а та куда грузятся данные - 27. При импорте задаю 8 названий столбцов, куда и записываются данные из файла. К сожалению сам запрос воспроизвести не могу, так как делаю импорт через встроенный в phpMyAdmin.
Подскажите, может есть какие предположения что может быть не так и как это исправить.
Заранее благодарен.
Неактивен
Быть может следующее: на 71-101 строке не хватает столбцов
При экспорте заключите данные в обязательные кавычки - будет легче найти
недостающие столбцы (как Вам, так и MySQL).
Неактивен
Решил проблему следующим образом.
Скопировал нужную таблицу на локальный хостинг при помощи программы Sypex dumper. И через XAMPP локально запустил команду LOAD DATA LOCAL INFILE. Почему-то проблем с CSV файлом не возникло. Затем сделал дамп уже полной таблицы и вручную добавил на хостинге через phpMyAdmin (пришлось разбить файл на пять частей). По идее можно было залить обратно при помощи того же Sypex dumper, но сразу не подумал, а прежде чем переделівать решил проверить работоспособность базы.
Возникла следующая проблема.
В самом скрипте не предусмотрен импорт из файла, только ручной ввод, а данные о количестве товаров в той или иной группе записываются в другую таблицу. И соответственно при выводе определенной категории товаров, скрипт выдает только последнюю страницу списка, хотя многостраничный вывод в скрипте есть.
Подскажите, как правильно подсчитать количество записей в таблице по каждой категории, если в ней есть столбец, в котором хранится номер категории, чтобы потом это значение присвоить соответствующей ячейке из другой таблицы.
Заранее благодарен.
Отредактированно Nikolay (14.02.2008 20:26:17)
Неактивен
SELECT `column_name`, count(*) FROM `table_name` GROUP BY `column_name`;
Неактивен
Да, по этому запросу происходит выборка сколько записей соответствует каждому значению из стобца `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`;
Тоже ошибка. Подскажите, что неправильно?
Спасибо.
Неактивен
Во-первых, при использовании подзапроса его нужно брать в круглые скобки и естественно не забывать оператор 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`);
Неактивен
Попробовал, выдало ошибку
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
С чем это тожет быть связано? Как переделать запрос?
Неактивен
А какая версия MySQL у Вас?
Если вариант с INSERT (а не UPDATE) Вас устроит, то можно переписать запрос в виде
INSERT INTO `othertable` (`column_name`, `count_column_name`)
SELECT `column_name`, count(*) FROM `table_name` GROUP BY `column_name`;
Но вариант с UPDATE тоже должен работать, если Вы нигде не опечатались, и у Вас версия
MySQL достаточно новая.
Неактивен
Версия MySQL 5.0.45-community
Насчет опечаток. Проверял текст побуквенно, пытался менять поля идентификации, все тоже самое.
Сейчас попробую через INSERT.
Неактивен
А такой запрос не испортит мне `othertable`.`column_name`, мне же результаты подсчетов количества строк нужно записывать в столбец `count_column_name`, а `column_name` - это столбец идентификации, содержащий такой же набор значений, как и `column_name`в `table_name`.
Неактивен
Странно
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
Неактивен
Такой запрос добавит новые строчки. Если там уже есть строчки - он их оставит как есть.
UPDATE должен работать (см пример), видимо, Вы, все-таки, где-то опечатались.
Неактивен