powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подсчет разницы между двумя таблицами
43 сообщений из 43, показаны все 2 страниц
Подсчет разницы между двумя таблицами
    #38401380
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, добрый.
Прошу помощи в решении задачки.
Я программер, в sql не особо шарю.

Задача:
Есть две таблицы по 1`000`000 записей каждая, где храниться код и количество.
Коды одинаковые, количество разное.
Требуется получить код и разницу между суммой одинаковых кодов.

Пример:
таблица 1 таблица 2
код количество код количество
001 5 002 3
002 7 003 4
003 6 001 8

Что хочу на выходе:
код разница
001 -3
002 4
003 2

Что пишу для этого, (хотя уверен, что скорее всего бред, а не запрос):
SELECT `t`.`code` as `tc`, `d`.`code` as `dc`, COUNT(`t`.`count`)-COUNT(`d`.`count`) as `c` FROM `test` as `t`, `demo` as `d` GROUP BY `t`.`code`, `d`.`code` ORDER BY `t`.`code`

Что получаю:
А ничего не получаю, как нетрудно догадаться, сервак виснет в глухую.
Куда копать?
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401386
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hitenok,

может ли быть в одной таблице один код более одного раза?
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401389
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, чтобы было понятнее, кодов примерно 100.
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401390
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
коды в пределах каждой таблицы уникальны?
наборы кодов в разных таблицах совпадают или есть такие, что присутствуют только в одной?
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401398
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
коды могут не совпадать, т.е. в одной кодов может быть больше, чем в другой.
Коды не уникальны, есть уникальный id.
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401400
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hitenokда, чтобы было понятнее, кодов примерно 100.а, ну тогда терпимо :)
Код: sql
1.
2.
3.
4.
5.
select code,sum(case when t=1 then q else -q end) as delta from (
 select code,1 t,sum(sum) q from tbl1 group by 1,2
 UNION ALL
 select code,2 t,sum(sum) q from tbl2 group by 1,2
) t0 group by 1
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401407
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проверил, или я чет не понял или
#1054 - Unknown column 'sum' in 'field list'
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401434
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hitenok, а, оно у вас "count" называется. Ну переделайте запрос, долго, что ли?
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401437
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А, ток я не понял, что на что переделать, я же пишу не силен в запросах
SUM(SUM) на SUM(count)?
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401443
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hitenok,

да
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401445
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал заменить, все работает на вид как надо, спасибо большое!
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401448
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно только получить небольшой комментарий, а что дает вот это
sum(case when t=1 then q else -q end) ?
Я все остальное понял, а это так и не догнал.
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401455
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного проще:
Код: sql
1.
2.
3.
4.
5.
6.
7.
select код, sum(q) as разница
from (
  select код, sum(количество) as q from таблица1 group by код
  UNION ALL
  select код,-sum(количество) as q from таблица2 group by код
  ) u 
group by код
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401471
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007,

Работает, и результат тот же, но чуть быстрее и вам спасибо, тут мне вообще весь запрос ясен, хотя сам бы я до него не додумался.
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401482
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят, спасибо за помощь, реально помогли, а то я уже устал сервак перезапускать, чтобы попробовать очередной запрос.
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401486
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Последний вопрос, а можно ли этот запрос оптимизировать, так как выполняется он почти 2 секунды?
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401560
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не уникальный индекс (код, количество) - занимает много места, таблица дольше обновляется, но запрос считает быстро
не уникальный индекс (код) - занимает меньше места, таблица чуть быстрее обновляется, но запрос считает медленнее
без индекса - не занимает места под индекс, таблица обновляется быстро , но запрос считает очень долго :)
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401579
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007,

Так как все-таки можно повысить производительность именно для вывода данных из таблицы?
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401586
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hitenokТак как все-таки можно повысить производительность именно для вывода данных из таблицы?Покажите план последнего запроса.
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401597
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hitenokCygapb-007,

Так как все-таки можно повысить производительность именно для вывода данных из таблицы? 13.1.13. CREATE INDEX Syntax
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401598
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[/quot]Покажите план последнего запроса.[/quot]
Это как сделать?
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401601
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И таки да, miksoftПокажите план последнего запроса.
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401606
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hitenokПокажите план последнего запроса.
Это как сделать?хотя бы подставьте перед запросом слово EXPLAIN
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401608
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
id	select_type	table		type	possible_keys	key	key_len	ref	rows	Extra
1	PRIMARY		<derived2>	ALL	NULL		NULL	NULL	NULL	202	Using temporary; Using filesort
2	DERIVED		test		index	NULL		code	4	NULL	252140	 
3	UNION		demo		index	NULL		code	4	NULL	208868	 
NULL	UNION RESULT	<union2,3>	ALL	NULL		NULL	NULL	NULL	NULL
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401617
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теперь еще хорошо бы увидеть, что это за индекс code в каждой из таблиц
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401623
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, легко, скажи как узнать его и все напишу.
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401626
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hitenokДа, легко, скажи как узнать его и все напишу.эх...
SHOW CREATE TABLE имя_таблицы
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401634
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я честно сознался в запроса и базах не силен, так что много просто не знаю, но готов делать, что надо.

CREATE TABLE `test` (
`id` int(11) NOT NULL auto_increment,
`code` int(11) NOT NULL,
`count` int(5) NOT NULL,
`created` timestamp NOT NULL default CURRENT_TIMESTAMP,
UNIQUE KEY `id` (`id`),
KEY `code` (`code`),
KEY `count` (`count`)
) ENGINE=InnoDB AUTO_INCREMENT=274242 DEFAULT CHARSET=utf8

таблица demo аналогична этой.
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401641
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы предложил создать индекс ALTER TABLE `test` ADD INDEX (`code`,`count`) для каждой из таблиц, сделать ANALYZE TABLE, аналогично, для каждой из таблиц и заново посмотреть на время и план запроса.
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401650
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал, время примерно тоже самое, т.е. нет кардинальных изменений.

Код: plaintext
1.
2.
3.
4.
id	select_type	table		type	possible_keys	key	key_len	ref	rows	Extra
1	PRIMARY		<derived2>	ALL	NULL		NULL	NULL	NULL	202	Using temporary; Using filesort
2	DERIVED		test		index	NULL		code	4	NULL	292976	 
3	UNION		demo		index	NULL		code	4	NULL	249253	 
NULL	UNION RESULT	<union2,3>	ALL	NULL		NULL	NULL	NULL	NULL
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401698
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hitenok,

Странно, предлагаемый мной индекс не подхватился.
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401714
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Убрал индекс с count и code в обоих таблицах, твой подхватился, но стало гораздо медленнее.

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 202 Using temporary; Using filesort
2 DERIVED test index NULL code_2 8 NULL 357884 Using index
3 UNION demo index NULL code_2 8 NULL 314322 Using index
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401718
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksofthitenok,

Странно, предлагаемый мной индекс не подхватился.Угу, непонятно...
А можно еще раз SHOW CREATE TABLE имя_таблицы ?
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401721
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CREATE TABLE `test` (
`id` int(11) NOT NULL auto_increment,
`code` int(11) NOT NULL,
`count` int(5) NOT NULL,
`created` timestamp NOT NULL default CURRENT_TIMESTAMP,
UNIQUE KEY `id` (`id`),
KEY `code_2` (`code`,`count`)
) ENGINE=InnoDB AUTO_INCREMENT=361379 DEFAULT CHARSET=utf8
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401723
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CREATE TABLE `demo` (
`id` int(11) NOT NULL auto_increment,
`code` int(11) NOT NULL,
`count` int(5) NOT NULL,
`created` timestamp NOT NULL default CURRENT_TIMESTAMP,
UNIQUE KEY `id` (`id`),
KEY `code_2` (`code`,`count`)
) ENGINE=InnoDB AUTO_INCREMENT=317929 DEFAULT CHARSET=utf8
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401813
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хммм... http://sqlfiddle.com/#!2/d2a11/2/0

Получается, что читать из покрывающего индекса для MySQL дороже, чем из таблицы?

Или оптимизатор в первую очередь смотрит на длину ключа?
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401829
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007Хммм... http://sqlfiddle.com/#!2/d2a11/2/0 Там вообще забавно, для одной таблицы использует индекс code, для другой code_2.
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401834
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftдля одной таблицы использует индекс code, для другой code_2.Правильно, унарный минус...
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401835
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftCygapb-007Хммм... http://sqlfiddle.com/#!2/d2a11/2/0 Там вообще забавно, для одной таблицы использует индекс code, для другой code_2.Да, потому что один закомментирован, а второй нет
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401841
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя для code_2 в EXTRA указано: Using index
вероятно, все же в этом случае за значением в таблицу не лезет...

Но тогда тем более непонятно, почему самостоятельно выбирает code, а не code_2
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401855
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не очень понимаю, о чем вы говорите, я чем могу помочь?
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401965
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уфф, все верно про покрывающие индексы :) Только непонятно, почему они автоматом не выбираются...

Test = 393381 строк, Demo = 270341 строк http://sqlfiddle.com/#!2/0d10cb/3

Key(Code): Record Count: 4; Execution Time: 2045ms
Key(Code,Count): Record Count: 4; Execution Time: 451ms
Код: sql
1.
2.
3.
4.
5.
6.
7.
select code, sum(count)count
from(
  select code, sum(count) count from test use index(code_2) group by code
  union all
  select code,-sum(count) count from demo use index(code_2) group by code
  )u
group by code;
...
Рейтинг: 0 / 0
Подсчет разницы между двумя таблицами
    #38401977
hitenok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, все верно, работает быстрее. Огромное спасибо!
...
Рейтинг: 0 / 0
43 сообщений из 43, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подсчет разницы между двумя таблицами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]