|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
10.08.2010, 15:09 | #1 |
Форумчанин
Регистрация: 29.10.2008
Сообщений: 294
|
Объединить запрос к нескольким таблицам в один (php+MySql)
Всем доброго дня!
Имеется одна огромная таблица с товарами, в которой помещены товары от 10 поставщиков. Запрос делаю так: Код:
Как теперь правильно сделать запрос, чтобы $result содержала результат поиска по всем 10 таблицам? Пробовал так: Код:
|
10.08.2010, 15:21 | #2 |
Форумчанин
Регистрация: 28.10.2008
Сообщений: 350
|
UNION вам в этом поможет.
|
10.08.2010, 15:56 | #3 |
Старожил
Регистрация: 09.09.2008
Сообщений: 2,624
|
И зачем? Какие непреодолимые препятствия были для того чтобы была 1 таблица?
Конечно не работает, вы как строку склеиваете что с чем? Вам надо эти данные сделать массивами и их обьединять или делать запрос UNION.
Стрелок-охотник
Последний раз редактировалось mv28jam; 10.08.2010 в 16:02. |
10.08.2010, 16:21 | #4 |
Форумчанин
Регистрация: 29.10.2008
Сообщений: 294
|
slips, спасибо! Работает. Я и забыл про UNION
mv28jam Поставщики обновляют прайсы с разной периодичностью, кто-то через день, кто-то через неделю. У каждого поставщика около 300 000 позиций. При одной таблице, приходилось каждый день обновлять ее полностью, это более 160МБ, очень долго и неудобно. А теперь я могу обновлять только того поставщика, который прислал новый прайс. |
11.08.2010, 09:15 | #5 |
Старожил
Регистрация: 09.09.2008
Сообщений: 2,624
|
Полностью это все записи что-ли? С таблицей правильной структуры таких проблем быть не должно.
Стрелок-охотник
|
12.08.2010, 10:23 | #6 | |
Форумчанин
Регистрация: 29.10.2008
Сообщений: 294
|
Да, полностью все записи.
В екселе сбиваю все прайсы в один, с помощью Migratin Tool перегоняю в MySql, далее делаю dump, гружу на хост и заливаю в базу. Теперь все тоже самое делаю только с одной таблицей, по которой есть новый прайс. Может посдскажете что-нибудь по-интереснее. Буду признателен. Цитата:
|
|
12.08.2010, 11:57 | #7 |
Старожил
Регистрация: 09.09.2008
Сообщений: 2,624
|
у вас есть десять поставщиков, есть товарамы у которых есть артикул(я так понимаю уникальный)
1)создаём таблицы товары = артикул|id_поставщика|ревизия|и тд при этом делаем составной ключ (артикул+id поставщика) ревизии = |id_поставщика|ревизия|датавремя 2)обновлённый прайс в экселе переводите в csv 3)далее используем MySql LOAD DATA INFILE (http://dev.mysql.com/doc/refman/5.1/en/load-data.html), который работает в разы быстрее того механизма который вы используете, в запросе указываем REPLACE за счет этого новые товары с одинаковым артикулом и поставщиком заменяются, после перечисления столбцов таблицы соответствующих данным в csv в запросе пишем SET id поставщика= поставщик1, ревизия = (старый номер ревизии +1) ; 4)удаляем лишние записи delete from товары where id_поставщика= поставщик1 and ревизия <> текущей Итого мы получаем: более быстрый импорт, во время импорта база не пуста, обновляем товары только одного производителя
Стрелок-охотник
|
12.08.2010, 16:53 | #8 | ||
Форумчанин
Регистрация: 29.10.2008
Сообщений: 294
|
mv28jam, очень сложно для меня. Можно по полочкам, для особо одаренных
1) есть таблица parts (13 полей) manufacturer_name, product_sku_orig, product_sku_alt, product_s_desc, product_in_stock, pruduct_availability, vendor_price, product_price, product_sku, category_id, vendor_name, vehicle_brand, product_margin Пример строки: Ford | 0101940 | - | рычаг подвески | 1 000 | 1 - 2 | 3 813.81 | 5 339.33 | 4-1000001 | 1 | CUP | Ford | 1 525.52 Понимаю, что делать составной ключ (product_sku_orig+vendor_name) не надо, так как меняем все записи по vendor_name. Далее делаю таблицу revision с полями vendor_name, revision, idate Пример строки:Ford,1,12082010 2) Перевожу в excel в csv: Ford;0101940;-;рычаг подвески;1 000;1 - 2; 3 813.81;5 339.33;4-1000001;1;CUP;Ford;1 525.52 3) Цитата:
LOAD DATA INFILE '/tmp/price.csv' INTO TABLE база.parts REPLACE FIELDS TERMINATED BY ';' ENCLOSED BY ' ' LINES TERMINATED BY '\r\n' IGNORE 1 LINES SET vendor_name = '?????', как присвоить текущее значение? revision = '?????+1', как присвоить текущее значение + 1? idate = str_to_date(CURRENT_TIMESTAMP, '%d/%m/%Y'); Так что-ли? 4) Цитата:
Последний раз редактировалось Maxx; 12.08.2010 в 17:31. |
||
13.08.2010, 09:24 | #9 | |||
Старожил
Регистрация: 09.09.2008
Сообщений: 2,624
|
Цитата:
Составной ключ тут нужен тк как у каждого поля должен быть уникальный ключ. Это нам нужно что при LOAD DATA заменялись одинаковые позиции. Цитата:
Поставщик же идёт 3им с конца? Цитата:
-читаем одну строку из csv достаём vendor_name($vendor_name=CUP) -делаем запрос чтобы определить ревизию $revision = (SELECT revision FROM revision WHERE vendor_name=$vendor_name) - LOAD DATA INFILE '/tmp/price.csv' INTO TABLE база.parts REPLACE FIELDS TERMINATED BY ';' ENCLOSED BY ' ' LINES TERMINATED BY '\r\n' SET revision = $revision+1; 4)После успешного завершения импорта обновляем ревизию UPDATE revision SET revision=revision+1, idate=(сейчас) WHERE vendor_name=$vendor_name 5)Далее чистим старые записи, которые не заместились DELETE FROM товары WHERE vendor_name=$vendor_name AND revision <> $revision+1 Ну вы вообще-то и так почти всё правльно поняли(я просто думал что в поставляемой таблице нет id поставщика и исходил из этого).
Стрелок-охотник
|
|||
13.08.2010, 10:05 | #10 |
Форумчанин
Регистрация: 29.10.2008
Сообщений: 294
|
Ну теперь кажется все понятно. Вопросы буду задавать по мере того, как что-то не будет получаться.
А сейчас хотел еще спросить: 1) как читать строку из csv и достать vendor_name? 2) все эти запросы выполняются прямо в phpMyAdmin в SQL запросах? 3) файл должен лежать в корне в папке tmp или можно так LOAD DATA LOCAL INFILE 'C:/price.csv' INTO TABLE база.parts 4) Для уникального ключа помимо столбца revision тогда должен быть еще один? У меня есть такой (product_sku). Это мой внутренный артикул: состоит из номера поставщика_порядковый номер, пр.: 4_0000001, 4_0000002 и т.д. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Объединить файлы в один с выборкой данных | serd | Microsoft Office Excel | 8 | 21.11.2009 11:35 |
Запрос к БД. PHP+MySQL | artemavd | PHP | 3 | 14.09.2009 02:51 |
Объединить в один файл | asale | Microsoft Office Excel | 2 | 12.02.2008 13:18 |
составить запрос к таблицам T1 и T2 | MonteCarlos | SQL, базы данных | 13 | 03.02.2008 14:05 |
Запрос по всем таблицам | Abay | SQL, базы данных | 3 | 27.09.2007 09:07 |