Есть ли лучший способ получить разницу между двумя таблицами с одинаковыми полями?

У меня есть две таблицы, как показано ниже:

table1:

+----+----------+-------+
| id | order_id | price |
+----+----------+-------+
|  1 |     1024 |    20 |
|  2 |     1025 |    30 |
|  3 |     1026 |    35 |
|  4 |     1027 |    45 |
+----+----------+-------+

table2

+----+----------+-------+------+
| id | order_id | price | name |
+----+----------+-------+------+
|  1 |     1024 |    20 | a    |
|  2 |     1025 |    30 | b    |
|  3 |     1026 |    35 | c    |
|  4 |     1027 |    40 | d    |
+----+----------+-------+------+

Что я хочу сделать, так это просто сравнить поля order_id и price и получить другой контент, когда order_id = 1027


Вот мое скромное мнение:


SELECT * FROM (

SELECT order_id, price FROM table1 

UNION ALL

SELECT order_id, price FROM table2

) t

GROUP BY order_id, price 

HAVING COUNT(*) = 1


# result 

+----------+-------+
| order_id | price |
+----------+-------+
|     1027 |    40 |
|     1027 |    45 |
+----------+-------+

Есть ли лучший способ получить его.

Любой комментарий очень приветствуется. большое спасибо.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
38
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Другой альтернативой может быть использование JOIN для поиска несовпадающих цен:

SELECT t1.order_id, t1.price AS table1_price, t2.price AS table2_price
FROM table1 t1
JOIN table2 t2 ON t2.order_id = t1.order_id AND t2.price != t1.price

Вывод:

order_id    table1_price    table2_price
1027        45              40

Демо на dbfiddle

Если вы также хотите захватить строки, которые существуют в одной таблице, но не существуют в другой, вам понадобится FULL OUTER JOIN, который MySQL не поддерживает, и его необходимо эмулировать с помощью UNION из LEFT JOIN и RIGHT JOIN:

SELECT * 
FROM (SELECT t1.order_id AS order_id, t1.price AS table1_price, t2.price AS table2_price
      FROM table1 t1
      LEFT JOIN table2 t2 ON t2.order_id = t1.order_id
      UNION
      SELECT t2.order_id, t1.price AS table1_price, t2.price AS table2_price
      FROM table1 t1
      RIGHT JOIN table2 t2 ON t2.order_id = t1.order_id) t
WHERE table1_price != table2_price OR
      table1_price IS NULL OR
      table2_price IS NULL

Вывод:

order_id    table1_price    table2_price
1027        45              40
1028        50              null
1029        null            45

Демо на dbfiddle

что, если в одной из этих двух таблиц есть только order_id 1028?

jia Jimmy 20.02.2019 08:19

@jiaJimmy, если вы имеете в виду, что только у table1 был order_id 1028, вы хотите, чтобы он отображался?

Nick 20.02.2019 08:21

да.. Это также разница между двумя таблицами

jia Jimmy 20.02.2019 08:22

@jiaJimmy, в таком случае то, как вы это делаете, является лучшим способом, поскольку вам нужен FULL OUTER JOIN, который MySQL не поддерживает напрямую и в любом случае должен эмулироваться с помощью UNION. Я могу написать запрос, если хотите...

Nick 20.02.2019 08:25

Спасибо за ответ, для меня это было очень полезно

jia Jimmy 20.02.2019 08:34

@jiaJimmy Я добавил запрос FULL OUTER JOIN, чтобы вы могли видеть, насколько это сложнее, чем то, что вы делаете.

Nick 20.02.2019 09:13

Вы можете использовать левое соединение, чтобы получить значения

SELECT table1.order_id, table1.price FROM table1 LEFT JOIN table2 ON table2.order_id = table1.order_id AND table2.price != table1.price

Другие вопросы по теме