использование нескольких функций суммирования столбцов нескольких таблиц в mysql дает неверные значения

У меня есть несколько таблиц MySQL, как показано ниже.

Table1
Att1 | Flag
xxx  |  1


Table2
Att1 | Flag
xxx  |  2
yyy  |  2


Table3
Att1 | Flag
xxx  |  3
yyy  |  3


Table4
Att1 | Flag
xxx  |  4

Table5
Att1 | Flag
xxx  |  6



Каждая таблица имеет несколько атрибутов, помимо вышеперечисленных. Я хотел бы суммировать атрибуты флагов каждой таблицы и ПРОСМОТРЕТЬ их. Код MySQL ниже.

create view block as 
select sum(table1.flag)as table1, sum(table2.flag)as table2,
sum(table3.flag) as table3,sum(table4.flag) as table4,
sum(table5.flag) as table5 
from table1,table2,table3,table4,table5;

Что я вижу на мой взгляд:

table1|table2|table3|table4|table5
4     |8     |12    |16    |24

То, что я на самом деле хочу видеть, на мой взгляд, это:

table1|table2|table3|table4|table5
1     |4     |6     |4     |6

Помоги мне! Заранее спасибо!


person Pramodh    schedule 18.01.2013    source источник


Ответы (3)


Попробуйте это вместо этого:

select table1, table2, table3, table4, table5
from (select sum(table1.flag)as table1) t1 cross join
     (select sum(table2.flag)as table2) t2 cross join
     (select sum(table3.flag)as table2) t3 cross join
     (select sum(table4.flag)as table2) t4 cross join
     (select sum(table5.flag)as table2) t5

Ваш запрос выполняет cross join, который является декартовым произведением среди таблиц. Лучший способ избежать этого — сделать отдельную агрегацию для каждой таблицы. Вы также можете сделать это в предложении select следующим образом:

select 
     (select sum(table1.flag)as table1) as t1,
     (select sum(table2.flag)as table2) as t2,
     (select sum(table3.flag)as table2) as t3,
     (select sum(table4.flag)as table2) as t4,
     (select sum(table5.flag)as table2) as t5
person Gordon Linoff    schedule 18.01.2013

Каждая строка из каждой таблицы соединяется с каждой строкой из каждой другой таблицы, а затем вы суммируете результаты. Это не то, что вы хотите. Попробуй это:

create view block as 
select 'table1' as tableName, sum(flag) from 
table1
UNION ALL
select 'table2' as tableName, sum(flag) from 
table2
UNION ALL
select 'table3' as tableName, sum(flag) from 
table3
UNION ALL
select 'table4' as tableName, sum(flag) from 
table4
UNION ALL
select 'table5' as tableName, sum(flag) from 
table5
person Ilion    schedule 18.01.2013
comment
Ответ Гордона Линоффа даст вам результат с именами столбцов, как вы описали. - person Ilion; 18.01.2013

Проблема с вашим запросом заключается в том, что вы выполняете перекрестное соединение (декартово соединение) для всех пяти таблиц. Поэтому вы фактически резюмируете:

Att1 | Flag | Att1 | Flag | Att1 | Flag | Att1 | Flag | Att1 | Flag
xxx  |  1   | xxx  |  2   | xxx  | 3    | xxx  |  4   | xxx  | 6
xxx  |  1   | yyy  |  2   | xxx  | 3    | xxx  |  4   | xxx  | 6
xxx  |  1   | xxx  |  2   | yyy  | 3    | xxx  |  4   | xxx  | 6
xxx  |  1   | yyy  |  2   | yyy  | 3    | xxx  |  4   | xxx  | 6
-----+------+------+------+------+------+------+------+------+-----
     |  4   |      |  8   |      | 12   |      |  16  |      | 24

Вместо этого вы хотите суммировать таблицы по отдельности; проще всего использовать 5 подзапросов:

SELECT (SELECT SUM(Flag) FROM table1) AS table1,
    (SELECT SUM(Flag) FROM table2) AS table2,
    (SELECT SUM(Flag) FROM table3) AS table3,
    (SELECT SUM(Flag) FROM table4) AS table4,
    (SELECT SUM(Flag) FROM table5) AS table5
person lc.    schedule 18.01.2013