2014-02-19 3 views
0

Мне нужно собирать количества из нескольких складов, периодически обновляющих их запасы. Файлы автоматически загружаются в таблицы в моей базе данных MySQL, но иногда на одном складе могут быть несколько более или менее файлов, чем другие. Мне нужно добавить их все, чтобы определить общее количество, доступное для всей сети.Как объединить несколько таблиц MySQL разных строк?

Моя идея состояла в том, чтобы сделать:

SELECT 
     IFNULL(branch_01.qty,0) + 
     IFNULL(branch_02.qty,0) + 
     IFNULL(branch_03.qty,0) + 

и т.д. через все склады присоединились:

FROM branch_01 
     JOIN branch_02 
     USING (oespaced) 
     JOIN branch_03 
     USING (oespaced) 

и т.д. через все склады

Я не могу использовать LEFT JOIN или RIGHT ПРИСОЕДИНИТЕСЬ, потому что иногда на одном складе могут отсутствовать записи, а иногда и другие. Если в файле одной ветви отсутствует sku, я предпочел бы, чтобы все остальные ветви были добавлены вместе, и просто получите NULL, который будет преобразован в 0 с помощью функций в SELECT. Когда я тестировал различные решения для соединения, я также, кажется, получаю декартовы числа строк, что меня смущает. Любые рекомендации приветствуются.

Немного разъяснений: Нам нужно присоединиться к 17 таблицам. Нас не интересует сумма столбца, а больше индивидуальных значений. Например, таблица может представлять список элементов a, b, c, d и список из 1,2,3,4. У нас будет эта таблица с нескольких разных складов, и нам нужно будет найти общую сумму для всей сети. Если бы четыре склада имели эти значения, мы хотели бы видеть a, b, c, d с 4,8,12,16 в качестве значений для всего доступного.

+0

Я понимаю, почему LEFT JOIN и RIGHT JOIN не сработают для вас - но вы пробовали ПОЛНУЮ ВНУТРЕННУЮ СОЕДИНЕННОСТЬ? – PaF

+0

Я думаю, что FULL OUTER JOIN будет хорошим решением, но из того, что я понимаю, MySQL этого не поддерживает, и он будет реализован путем выполнения LEFT JOIN слева и RIGHT JOIN справа. – user3326985

+0

Спасибо за разъяснение - к сожалению, все еще очень неясно. Я думаю, что конкретный пример (таблица t1 имеет столбцы c1, c2 и значения (v1a, v2a), (v1b, v2b), таблица t2 имеет столбцы ... и т. Д.). Во всяком случае, если правильное решение - ПОЛНАЯ ВНЕШНЯЯ ВСТУПЛЕНИЕ, а в MySQL вы не можете этого сделать, а затем имитировать его (как вы упомянули сами). – PaF

ответ

0

Я не совсем понимаю ваш вопрос, но надеюсь, что мой ответ поможет вам немного. Вы присоединяетесь ко многим столам? Итак, скажем, 2 таблицы, и вы хотите суммировать колонку количества?

Прежде всего, JOIN выполняет декартовое произведение из 2 (или более) таблиц. Таким образом, вы получите столько случаев, которые вы не хотите иметь; в решении этого вопроса используется WHERE.

Может быть, это то, что вы ищете:

SELECT sum(a.qty) + sum(b.qty) 
FROM table1 a, table2 b 
WHERE a.pk = b.fk -- this one resolves the unwanted instances 

Ф.К. обозначает внешний ключ и рк обозначает первичный ключ.

+0

Большое спасибо за предложения @krato. Я отредактировал свой первоначальный вопрос, надеюсь, добавлю немного разъяснений. ГДЕ, о котором вы говорили, вероятно, является ответом, но я не знаю, как это сделать с нашими плохими данными, поскольку одна ветка может только сообщать о, b, c, а другая может только сообщать о b, c и т. Д. Если ветка не " t сообщить элемент, нам все равно нужно знать значения из других ветвей вместо того, чтобы их опустить из результатов. – user3326985

Смежные вопросы