Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2010, 15:09   #1
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию Объединить запрос к нескольким таблицам в один (php+MySql)

Всем доброго дня!

Имеется одна огромная таблица с товарами, в которой помещены товары от 10 поставщиков. Запрос делаю так:
Код:
$link = mysql_pconnect(localhost, имя, пароль);
mysql_select_db(база);
mysql_query("set CHARACTER SET utf8");
mysql_query("SET OPTION SQL_BIG_SELECTS=1");
$query = "SELECT * FROM таблица WHERE артикул LIKE '%".$searchcode."%'";
$result = mysql_query($query);
Сделал для каждого поставщика отдельную таблицу.
Как теперь правильно сделать запрос, чтобы $result содержала результат поиска по всем 10 таблицам?
Пробовал так:
Код:
$link = mysql_pconnect(localhost, имя, пароль);
mysql_select_db(база);
mysql_query("set CHARACTER SET utf8");
mysql_query("SET OPTION SQL_BIG_SELECTS=1");
$query = "SELECT * FROM таблица1 WHERE артикул LIKE '%".$searchcode."%'";
$result = mysql_query($query);
$query = "SELECT * FROM таблица2 WHERE артикул LIKE '%".$searchcode."%'";
$result .= mysql_query($query);
Не работает
Maxx вне форума Ответить с цитированием
Старый 10.08.2010, 15:21   #2
slips
Форумчанин
 
Аватар для slips
 
Регистрация: 28.10.2008
Сообщений: 350
По умолчанию

UNION вам в этом поможет.
slips вне форума Ответить с цитированием
Старый 10.08.2010, 15:56   #3
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Цитата:
Сообщение от Maxx Посмотреть сообщение
Сделал для каждого поставщика отдельную таблицу.
И зачем? Какие непреодолимые препятствия были для того чтобы была 1 таблица?

Цитата:
Сообщение от Maxx Посмотреть сообщение
$result = mysql_query($query);
$query = "SELECT * FROM таблица2 WHERE артикул LIKE '%".$searchcode."%'";
$result .= mysql_query($query);
Конечно не работает, вы как строку склеиваете что с чем? Вам надо эти данные сделать массивами и их обьединять или делать запрос UNION.
Стрелок-охотник

Последний раз редактировалось mv28jam; 10.08.2010 в 16:02.
mv28jam вне форума Ответить с цитированием
Старый 10.08.2010, 16:21   #4
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию

slips, спасибо! Работает. Я и забыл про UNION

mv28jam
Поставщики обновляют прайсы с разной периодичностью, кто-то через день, кто-то через неделю. У каждого поставщика около 300 000 позиций.
При одной таблице, приходилось каждый день обновлять ее полностью, это более 160МБ, очень долго и неудобно. А теперь я могу обновлять только того поставщика, который прислал новый прайс.
Maxx вне форума Ответить с цитированием
Старый 11.08.2010, 09:15   #5
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Цитата:
Сообщение от Maxx Посмотреть сообщение
...приходилось каждый день обновлять ее полностью, это более 160МБ, очень долго и неудобно...
Полностью это все записи что-ли? С таблицей правильной структуры таких проблем быть не должно.
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 12.08.2010, 10:23   #6
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию

Да, полностью все записи.
В екселе сбиваю все прайсы в один, с помощью Migratin Tool перегоняю в MySql, далее делаю dump, гружу на хост и заливаю в базу.

Теперь все тоже самое делаю только с одной таблицей, по которой есть новый прайс.
Может посдскажете что-нибудь по-интереснее. Буду признателен.
Цитата:
С таблицей правильной структуры ...
а с этого места можно по-подробнее.
Maxx вне форума Ответить с цитированием
Старый 12.08.2010, 11:57   #7
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Цитата:
Сообщение от Maxx Посмотреть сообщение
а с этого места можно по-подробнее.
у вас есть десять поставщиков, есть товарамы у которых есть артикул(я так понимаю уникальный)
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 ревизия <> текущей

Итого мы получаем: более быстрый импорт, во время импорта база не пуста, обновляем товары только одного производителя
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 12.08.2010, 16:53   #8
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 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)
Цитата:
далее используем MySql LOAD DATA INFILE
Здесь засада, я не понимаю. Где используем.Как составить. Помогите, плз.
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)
Цитата:
delete from товары where id_поставщика= поставщик1 and ревизия <> текущей
тут я вообще бессилен :-(

Последний раз редактировалось Maxx; 12.08.2010 в 17:31.
Maxx вне форума Ответить с цитированием
Старый 13.08.2010, 09:24   #9
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Цитата:
Сообщение от Maxx Посмотреть сообщение
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.
Составной ключ тут нужен тк как у каждого поля должен быть уникальный ключ. Это нам нужно что при LOAD DATA заменялись одинаковые позиции.

Цитата:
Сообщение от Maxx Посмотреть сообщение
Далее делаю таблицу revision с полями vendor_name, revision, idate
Пример строки:Ford,1,12082010
Видимо не Ford,1,12082010 а CUP,1,12082010
Поставщик же идёт 3им с конца?
Цитата:
Сообщение от Maxx Посмотреть сообщение
2) Перевожу в excel в csv: Ford;0101940;-;рычаг подвески;1 000;1 - 2; 3 813.81;5 339.33;4-1000001;1;CUP;Ford;1 525.52
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

Цитата:
Сообщение от Maxx Посмотреть сообщение
mv28jam, очень сложно для меня. Можно по полочкам, для особо одаренных
Ну вы вообще-то и так почти всё правльно поняли(я просто думал что в поставляемой таблице нет id поставщика и исходил из этого).
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 13.08.2010, 10:05   #10
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 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 и т.д.
Maxx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединить файлы в один с выборкой данных 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