powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос MYSQL для выбора разниц
14 сообщений из 14, страница 1 из 1
Запрос MYSQL для выбора разниц
    #39973982
ADMINCHIKKK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем.
Помогите с запросом. Есть две таблицы, оба с одинаковой структурой.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
MariaDB [test]> describe tabl1_1;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
| summa | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+



Код: plsql
1.
2.
3.
4.
5.
6.
7.
MariaDB [test]> describe tabl1_2;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
| summa | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+



вот данные:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
MariaDB [test]> select * from tabl1_1;
+------+-------+
| id   | summa |
+------+-------+
|    1 |   100 |
|    2 |   200 |
|    3 |   300 |
|    5 |   500 |
|    6 |   600 |
|    8 |   800 |
|   10 |  1000 |
+------+-------+



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
MariaDB [test]> select * from tabl1_2;
+------+-------+
| id   | summa |
+------+-------+
|    1 |   100 |
|    2 |   250 |
|    3 |   300 |
|    4 |   400 |
|    6 |   600 |
|    9 |   900 |
|   10 |  1100 |
+------+-------+



Задача такая. Надо вывести отличающиеся данные. 1) если есть и там и там, но сумма разная 2) если есть в первой, но нет такого айди вообще во второй 3) если есть во второй, но такого айди нет в первой. Примерно чтобы вывести примерно такое:

Код: plaintext
1.
2.
3.
4.
5.
6.
id		summa1		summa2		diference
2		200		250		-50
4		0		400		-400
5		500		0		500
8		800		0		800
9		0		900		-900
10		1000		1100		-100

Спасибо.
...
Рейтинг: 0 / 0
Запрос MYSQL для выбора разниц
    #39973988
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ADMINCHIKKK
Есть две таблицы, оба с одинаковой структурой.
Пожалуйста, в виде CREATE TABLE.

ADMINCHIKKK
вот данные:
Пожалуйста, в виде INSERT INTO.

И укажите ТОЧНО версию сервера.
...
Рейтинг: 0 / 0
Запрос MYSQL для выбора разниц
    #39973990
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS. В общем случае задача нерешаема. По причине ОТСУТСТВИЯ ограничения уникальности на поле id в каждой из таблиц.

Вот окажутся в таблицах по две записи с одним и тем же id и четырьмя разными суммами - ну и чего прикажете выводить?
...
Рейтинг: 0 / 0
Запрос MYSQL для выбора разниц
    #39974006
ADMINCHIKKK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, точно заметили. Это таблицы теста, чтобы решить задачу создал их, и забыл об этой загвоздке. Но добавим в эту задачу условие, что ID это примари кей :)
...
Рейтинг: 0 / 0
Запрос MYSQL для выбора разниц
    #39974025
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
CREATE TABLE IF NOT EXISTS test.tabl1_1
(
    id    INTEGER NOT NULL PRIMARY KEY,
    summa INTEGER NOT NULL
);
INSERT INTO test.tabl1_1
VALUES (1, 100),
       (2, 200),
       (3, 300),
       (5, 500),
       (6, 600),
       (8, 800),
       (10, 1000);
CREATE TABLE IF NOT EXISTS test.tabl1_2
(
    id    INTEGER NOT NULL PRIMARY KEY,
    summa INTEGER NOT NULL
);
INSERT INTO test.tabl1_2
VALUES (1, 100),
       (2, 250),
       (3, 300),
       (4, 400),
       (6, 600),
       (9, 900),
       (10, 1100);

SELECT t1.id as id1, t1.summa summa1, t2.summa summa2, 'identical' as operation
FROM test.tabl1_1 as t1
         LEFT JOIN test.tabl1_2 as t2 ON t1.id = t2.id AND t1.summa = t2.summa
WHERE t2.id IS NOT NULL
UNION
SELECT t1.id, t1.summa,t2.summa, 'deleted'
FROM test.tabl1_1 as t1
         LEFT JOIN test.tabl1_2 as t2 ON t1.id = t2.id
WHERE t2.id IS NULL
UNION
SELECT t1.id, t1.summa,t2.summa, 'changed'
FROM test.tabl1_1 as t1
         LEFT JOIN test.tabl1_2 as t2 ON t1.id = t2.id AND t1.summa != t2.summa
WHERE t2.id IS NOT NULL
UNION
SELECT t2.id, t2.summa,t2.summa, 'new'
FROM test.tabl1_1 as t1
         RIGHT JOIN test.tabl1_2 as t2 ON t1.id = t2.id
WHERE t1.id IS NULL
ORDER BY id1;
...
Рейтинг: 0 / 0
Запрос MYSQL для выбора разниц
    #39974032
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bochkov, первый селект лишний

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT t1.id as id, t1.summa summa1, t2.summa summa2, t1.summa - t2.summa diference
FROM tabl1_1 as t1
JOIN tabl1_2 as t2 ON t1.id = t2.id
WHERE t1.summa <> t2.summa
UNION
SELECT t1.id as id, t1.summa summa1, t2.summa summa2, t1.summa
FROM tabl1_1 as t1
LEFT JOIN tabl1_2 as t2 ON t1.id = t2.id
WHERE t2.id IS NULL
UNION
SELECT t2.id, t1.summa, t2.summa, - t2.summa 
FROM tabl1_1 as t1
RIGHT JOIN tabl1_2 as t2 ON t1.id = t2.id
WHERE t1.id IS NULL
...
Рейтинг: 0 / 0
Запрос MYSQL для выбора разниц
    #39974040
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну или так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT t1.id as id, t1.summa summa1, COALESCE(t2.summa, 0) summa2, t1.summa - COALESCE(t2.summa, 0) diference
FROM tabl1_1 as t1
LEFT JOIN tabl1_2 as t2 ON t1.id = t2.id AND 
WHERE t1.summa <> t2.summa OR t2.id IS NULL
UNION
SELECT t2.id, COALESCE(t1.summa, 0), t2.summa, - t2.summa 
FROM tabl1_1 as t1
RIGHT JOIN tabl1_2 as t2 ON t1.id = t2.id
WHERE t1.id IS NULL
...
Рейтинг: 0 / 0
Запрос MYSQL для выбора разниц
    #39974043
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT id, SUM(summa1) summa1, SUM(summa2) summa2, SUM(summa1) - SUM(summa2) difference
FROM ( SELECT id, summa summa1, 0 summa2
       FROM tabl1_1
       UNION ALL
       SELECT id, 0, summa summa2
       FROM tabl1_2) total
GROUP BY id
/* HAVING difference */;


fiddle

Последнюю строку раскомментировать, если если не нужны записи, где суммы равны.

ORDER BY - добавить по вкусу.
...
Рейтинг: 0 / 0
Запрос MYSQL для выбора разниц
    #39974054
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paver
bochkov, первый селект лишний

да я просто ранее делал подобное для репликации,
ну и здесь повторил
...
Рейтинг: 0 / 0
Запрос MYSQL для выбора разниц
    #39974088
ADMINCHIKKK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ОГРОМНОЕ СПАСИБО!

Все варинаты работают, всё работает.
Пойду вникать в запросы, чтобы понять как всё работает.

Помогли!
...
Рейтинг: 0 / 0
Запрос MYSQL для выбора разниц
    #39974110
ADMINCHIKKK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А по скорости наверно все варинаты почти одинаково ду сработают? Если данных очень много будет?
...
Рейтинг: 0 / 0
Запрос MYSQL для выбора разниц
    #39974115
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ADMINCHIKKK
Если данных очень много будет?
Наилучшую производительность обеспечит
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT id, SUM(summa1) summa1, SUM(summa2) summa2, SUM(summa1) - SUM(summa2) difference
FROM ( SELECT id, SUM(summa) summa1, 0 summa2
       FROM tabl1_1
       GROUP BY id
       UNION ALL
       SELECT id, 0, SUM(summa) summa2
       FROM tabl1_2
       GROUP BY id ) total
GROUP BY id
/* HAVING difference */;


fiddle

Желательно наличие индекса по (id, summa) в каждой из таблиц.
...
Рейтинг: 0 / 0
Запрос MYSQL для выбора разниц
    #39974238
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, а в чем смысл группировок таблиц по уникальному полю? Да еще и с использованием агрегатных функций?
...
Рейтинг: 0 / 0
Запрос MYSQL для выбора разниц
    #39974253
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paver , уникальность ID - это добавленное автором условие:
ADMINCHIKKK
добавим в эту задачу условие, что ID это примари кей

Т.е. надо так понимать, что реально оно ни разу не уник.

А если всё же уник - то тогда используется предыдущая, без группировки в отдельных подзапросах, версия запроса.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос MYSQL для выбора разниц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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