Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос MYSQL для выбора разниц / 14 сообщений из 14, страница 1 из 1
28.06.2020, 21:39
    #39973982
ADMINCHIKKK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос MYSQL для выбора разниц
Привет всем.
Помогите с запросом. Есть две таблицы, оба с одинаковой структурой.

Код: 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
28.06.2020, 22:17
    #39973988
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос MYSQL для выбора разниц
ADMINCHIKKK
Есть две таблицы, оба с одинаковой структурой.
Пожалуйста, в виде CREATE TABLE.

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

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

Вот окажутся в таблицах по две записи с одним и тем же id и четырьмя разными суммами - ну и чего прикажете выводить?
...
Рейтинг: 0 / 0
29.06.2020, 00:24
    #39974006
ADMINCHIKKK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос MYSQL для выбора разниц
Да, точно заметили. Это таблицы теста, чтобы решить задачу создал их, и забыл об этой загвоздке. Но добавим в эту задачу условие, что ID это примари кей :)
...
Рейтинг: 0 / 0
29.06.2020, 05:32
    #39974025
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос MYSQL для выбора разниц
Код: 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
29.06.2020, 07:12
    #39974032
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос MYSQL для выбора разниц
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
29.06.2020, 07:50
    #39974040
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос MYSQL для выбора разниц
ну или так

Код: 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
29.06.2020, 08:01
    #39974043
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос MYSQL для выбора разниц
Код: 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
29.06.2020, 08:50
    #39974054
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос MYSQL для выбора разниц
paver
bochkov, первый селект лишний

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

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

Помогли!
...
Рейтинг: 0 / 0
29.06.2020, 11:35
    #39974110
ADMINCHIKKK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос MYSQL для выбора разниц
А по скорости наверно все варинаты почти одинаково ду сработают? Если данных очень много будет?
...
Рейтинг: 0 / 0
29.06.2020, 11:52
    #39974115
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос MYSQL для выбора разниц
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
29.06.2020, 17:15
    #39974238
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос MYSQL для выбора разниц
Akina, а в чем смысл группировок таблиц по уникальному полю? Да еще и с использованием агрегатных функций?
...
Рейтинг: 0 / 0
29.06.2020, 18:16
    #39974253
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос MYSQL для выбора разниц
paver , уникальность ID - это добавленное автором условие:
ADMINCHIKKK
добавим в эту задачу условие, что ID это примари кей

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

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


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