Сравнение двух списков в MySQL: LEFT JOIN против расхождений
Типичный кейс
Нужно сверить два набора ключей — например, номера платежей по банку и по вашему интернет‑магазину на Битрикс (b_sale_* или кастомные таблицы). Самый прямой путь через временные таблицы и два зеркальных LEFT JOIN.
Таблицы для сличения
CREATE TABLE t_bank (
id VARCHAR(64) NOT NULL DEFAULT '',
UNIQUE KEY ux_bank (id)
);
CREATE TABLE t_site (
id VARCHAR(64) NOT NULL DEFAULT '',
UNIQUE KEY ux_site (id)
);
Заполнить и сравнить
INSERT IGNORE INTO t_site VALUES
('some data 1'), ('some data 2'), ('some data 3');
INSERT IGNORE INTO t_bank VALUES
('some data 1'), ('some data 2');
Строки, которые есть на сайте, но не пришли из банка
SELECT s.*
FROM t_site s
LEFT JOIN t_bank b ON s.id = b.id
WHERE b.id IS NULL;
В примере — одна строка some data 3.
Строки из банка, которых нет на сайте
SELECT b.*
FROM t_bank b
LEFT JOIN t_site s ON s.id = b.id
WHERE s.id IS NULL;
Для демонстрационных данных второй результат пустой; в бою здесь находят поступления без заказов.
В контексте Битрикс
Вместо временных таблиц можно использовать CREATE TEMPORARY TABLE … AS SELECT … из выборок по заказам и выгрузки банка, затем тех же два запроса. Убедитесь в единых форматах ключа (пробелы, регистр, внешние коды платёжных систем).
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии