最も簡単な方法は、ロジックを拡張して両方のケースを含めることです。
SELECT id, user_name, color1, color2, fruit1, fruit2
FROM myTable
WHERE (color1 <> color2 AND fruit1 = fruit2)
OR (color1 = color2 AND fruit1 <> fruit2)
あなたのコメントから、もう少し複雑なことを試す必要があります。
SELECT nonmatching.id, user_name, prop_name, value1, value2
FROM
(
SELECT id, user_name, prop_name, value1, value2
FROM
(
SELECT id, user_name, 'color' AS prop_name,
color1 AS value1, color2 AS value2
FROM myTable
UNION ALL
SELECT id, user_name, 'fruit' AS prop_name,
fruit1 AS value1, fruit2 AS value2
FROM myTable
) propertyExpanded
WHERE value1 <> value2
) nonmatching
たとえば、1 つの不一致がある行のみを返したい場合は、次を追加できます。
INNER JOIN
(
SELECT id, COUNT(1) AS mismatchCount = 1
FROM
(
SELECT id, user_name, 'color' AS prop_name,
color1 AS value1, color2 AS value2
FROM myTable
UNION ALL
SELECT id, user_name, 'fruit' AS prop_name,
fruit1 AS value1, fruit2 AS value2
FROM myTable
) propertyExpanded
WHERE value1 <> value2
GROUP BY id
) nonmatchingCount ON nonmatching.id = nonmatchingCount.id
WHERE nonmatchingCount.mismatchCount = 1