Shirt1:
1;1;"green_shirt";1;1;1
4;4;"yellow_shirt";1;1;1
Shirt2:
1;1;"green_shirt";1;1;1
2;2;"red_shirt";1;1;1
3;3;"orange_shirt";1;1;1
SELECT shirt2.*
FROM shirt1
RIGHT OUTER JOIN shirt2 ON shirt1.key = shirt2.key
WHERE shirt1.description != shirt2.description OR
IFNULL(shirt1.size, -1) != IFNULL(shirt2.size, -1) OR
IFNULL(shirt1.timestamp, -1) != IFNULL(shirt2.timestamp, -1) OR
IFNULL(shirt1.is_on, -1) != IFNULL(shirt2.is_on, -1)
UNION ALL
SELECT shirt1.*
FROM shirt2
RIGHT JOIN shirt1 ON shirt1.key = shirt2.key
WHERE shirt1.description != shirt2.description OR
IFNULL(shirt1.size, -1) != IFNULL(shirt2.size, -1) OR
IFNULL(shirt1.timestamp, -1) != IFNULL(shirt2.timestamp, -1) OR
IFNULL(shirt1.is_on, -1) != IFNULL(shirt2.is_on, -1)
UNION ALL
SELECT shirt1.*
FROM shirt1
INNER JOIN shirt2 ON shirt1.key = shirt2.key
WHERE shirt1.description = shirt2.description OR
IFNULL(shirt1.size, -1) = IFNULL(shirt2.size, -1) OR
IFNULL(shirt1.timestamp, -1) = IFNULL(shirt2.timestamp, -1) OR
IFNULL(shirt1.is_on, -1) = IFNULL(shirt2.is_on, -1)
Выход:
2;2;"red_shirt";1;1;1
3;3;"orange_shirt";1;1;1
4;4;"yellow_shirt";1;1;1
1;1;"green_shirt";1;1;1
Если вы хотите исключить рубашки, которые включены в рубашку1 / рубашка2, вам просто нужно удалить последний союз. Это значит
SELECT shirt2.*
FROM shirt1
RIGHT OUTER JOIN shirt2 ON shirt1.key = shirt2.key
WHERE shirt1.description != shirt2.description OR
IFNULL(shirt1.size, -1) != IFNULL(shirt2.size, -1) OR
IFNULL(shirt1.timestamp, -1) != IFNULL(shirt2.timestamp, -1) OR
IFNULL(shirt1.is_on, -1) != IFNULL(shirt2.is_on, -1)
UNION ALL
SELECT shirt1.*
FROM shirt2
RIGHT JOIN shirt1 ON shirt1.key = shirt2.key
WHERE shirt1.description != shirt2.description OR
IFNULL(shirt1.size, -1) != IFNULL(shirt2.size, -1) OR
IFNULL(shirt1.timestamp, -1) != IFNULL(shirt2.timestamp, -1) OR
IFNULL(shirt1.is_on, -1) != IFNULL(shirt2.is_on, -1)
Выход:
2;2;"red_shirt";1;1;1
3;3;"orange_shirt";1;1;1
4;4;"yellow_shirt";1;1;1
Думаю, вы захотите, чтобы все было в одной колонке, поэтому я думаю, что это должно быть лучшим решением. Если вы согласны с наличием разных столбцов для shirt1 / shirt2, вы также можете использовать select * и игнорировать объединение.
Вопрос об устройстве: зависит от устройства, но если устройство старое, то я не думаю, что запрос будет вашей основной проблемой. Вы также можете попробовать добавить несколько индексов для повышения производительности.
Редактировать: изменено решение для присоединения к ключевому столбцу