У меня есть две таблицы, как показано ниже:
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 |
+----------+-------+
Есть ли лучший способ получить его.
Любой комментарий очень приветствуется. большое спасибо.






Другой альтернативой может быть использование 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
Если вы также хотите захватить строки, которые существуют в одной таблице, но не существуют в другой, вам понадобится 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
@jiaJimmy, если вы имеете в виду, что только у table1 был order_id 1028, вы хотите, чтобы он отображался?
да.. Это также разница между двумя таблицами
@jiaJimmy, в таком случае то, как вы это делаете, является лучшим способом, поскольку вам нужен FULL OUTER JOIN, который MySQL не поддерживает напрямую и в любом случае должен эмулироваться с помощью UNION. Я могу написать запрос, если хотите...
Спасибо за ответ, для меня это было очень полезно
@jiaJimmy Я добавил запрос FULL OUTER JOIN, чтобы вы могли видеть, насколько это сложнее, чем то, что вы делаете.
Вы можете использовать левое соединение, чтобы получить значения
SELECT table1.order_id, table1.price
FROM table1
LEFT JOIN table2 ON table2.order_id = table1.order_id AND table2.price != table1.price
что, если в одной из этих двух таблиц есть только order_id
1028?