Решаемо ли это?

macros

Guest
Решаемо ли это?

Простите за длинный вопрос, старался чтоб было максимально наглядно.
Описывать задачу словами было бы длинее.
С виду простая задача на поверку оказалась достаточно хитрой.:(

новая таблица 1.
unic ID | title |кол-во1
--------+-------+-------
11 |книга | 2
22 |книга | 3

новая таблица 2.
unic ID | title |кол-во2
--------+-------+-------
11 |книга | 8
44 |книга | 4
55 |книга | 6


существующая таблица (большая)
unic ID | title |кол-во1 |кол-во2
--------+-------+--------+-------
11 |книга | 1 | 1
44 |книга | 1 | 1
66 |книга | 18 | 19


Существующая таблица какой должна стать после обновления
unic ID | title |кол-во1 |кол-во2
--------+-------+--------+-------
11 |книга | 2 | 8
22 |книга | 3 | 0
44 |книга | 1 | 4
55 |книга | 0 | 6
66 |книга | 18 | 19

Это решаемо?
 

macros

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

macros

Guest
Потому как, имхо, это здорово облегчает задачу мне, но конечный пользователь ( КАЖДЫЙ !!!) будет тратить на поиск в два раза больше времени.
Такой подход к работе по крайней мере неприличен.
 

Demiurg

Guest
А зачем генерить две таблицы ? Прямо из csv делай нужную таблицу.
 

macros

Guest
Привет, Demiurg.
Ты как всегда оказался прав. Правда до меня уже вроде дошло.
Я дуаю так:
читаем CSV файл для первого магазина в масссив

далее в цикле
$sql = "SELECT кол-во2 FROM $userstable WHERE unic ID= $unic ID[$i] ";
$result = MYSQL_QUERY($sql);
$rows = MYSQL_NUMROWS($result);
///если 0, т.е. записи нет то $кол-во2=0
//если не 0 то $кол-во2 найденному
//replase строку с $кол-вом1 + $кол-вом2 в таблицу и дело с концом

Поправь меня, если я не прав. Не будет ли слишком долго работать.
Другого выхода я просто не вижу.

P.S. Про пиво обещанное я не забыл. Нельзя ли проставиться через visa-electron?
WM карточек у нас нет а пополнять переводами лениво до ужаса.

С уважением
 

Demiurg

Guest
Да, если у тебя записей с магазинов приходит не много, то наверно легче будет так. А если их много, тогда можно сделать 2 временные таблицы и что-нибудь на подобии:
replace final_table
select final_table.unic_id , final_table.title , final_table.kol1+tab1.kol as kol1 , final_table.kol2+tab2.kol as kol2
from final_table left join tab1 using(unic_id) left join tab2 using(unic_id)

запрос не проверял, главное идея.

>Нельзя ли проставиться через visa-electron?
а через неё можно пиво переводить ? :)
 

Barlone

Guest
Э, нет, так не выйдет - идея плохая. Нельзя выборку из таблицы сделать и в ту же таблицу вставить. Ошибку получим, что-то типа "INSERT TABLE 'final_table' isn't allowed in FROM table list"
 

Demiurg

Guest
Ну тогда это можно провернуть через третюю темповою таблицу.
 

macros

Guest
Ребята, я наверное не совсем правильно объяснил
Я делаю выборку из таблицы только одного значения, которого нету в CSV файле.
Потом ставлю его в во вставляемый в таблицу перечень переменных из файла как еще одну переменную
И только потом делаю replace
Сейчас я эту мысль оттестирую и сообщу о результате.
В крайнем случае сделаю темповую table.
 

chira

Новичок
Если с CSV файлах приходят данные о поступлении нового товара в магазины (хотя по приведенным примерам в начале, это не скажешь) , то могу предложить вариант в три SQLa.

CREATE TEMPORARY TABLE t12
SELECT t.unic_id, t.title
, IFNULL(f.kol1,0)+t.kol as kol1
, IF(IFNULL(t2.kol,0) > 0,0,IFNULL(f.kol2,0)) as kol2
FROM tab1 t LEFT JOIN final_table f USING(unic_id)
LEFT JOIN tab2 t2 ON f.unic_id=t2.unic_id

INSERT INTO t12
SELECT t.unic_id, t.title
, IF(IFNULL(t1.kol,0) > 0,0,IFNULL(f.kol1,0)) as kol1
, IFNULL(f.kol2,0)+t.kol as kol2
FROM tab2 t LEFT JOIN final_table f USING(unic_id)
LEFT JOIN tab1 t1 ON f.unic_id=t1.unic_id

REPLACE final_table
select unic_id, title, SUM(kol1), SUM(kol2)
from t12
GROUP BY unic_id, title
 

macros

Guest
Уважаемый chira!
по поводу приведенных в начале примеров ты прав.
База централизованная
Изменения приходят из столицы в виде фрагмента таблицы т.е.
только те строки которые в нашей таблице изменились.
Если бы была одна таблица проблем бы не было.

replace oldtable select * from newtable

А в общем, ВСЕМ СПАСИБО!
Все заработало безо всяких временных таблиц.
Вопрос закрыт если кому попадется подобное- подскажу.

P.S. Разработчику этой дебильной базы, я бы и сам голову оторвал. Хотя, если бы она у него была...

С уважением
 
Сверху