Я новичок в mySQL и пытался решить это в течение дня. Я попытался сопоставить данные из столбца Want1 с предложением1 и Want2 с предложением2, но Type также должен совпадать с другим uid. Каждый uid будет иметь только W или O в W/O (хотите/предлагать). Вот мой стол.
Таблица пользователей:
Id, Want1, Want2, Offer1, Offer2, Type, uid, W/O
--- ----- ----- ------ ------ ---- --- ---
1 a null null null KK 5 W
2 null b null null LL 30 W
3 null null a null KK 20 O
4 null null null b LL 13 O
5 null null a null BB 6 O
6 null null a null KK 70 O
Желаемый результат таблицы:
Want1, Want2, Offer1, Offer2, Type, uidW, uidO
----- ----- ------ ------ ---- ---- ----
a null a null KK 5 20
null b null b LL 30 13
a null a null KK 5 70
Можно ли использовать чистый SQL для получения этого результата?
Вот решение
SELECT w.want1,
w.want2,
o.offer1,
o.offer2,
w.Type,
w.uid AS uidW,
o.uid AS uidO
FROM my_table w LEFT JOIN
my_table o ON (IFNULL(w.want1, 'x') = IFNULL(o.offer1, 'x') AND
IFNULL(w.want2, 'x') = IFNULL(o.offer2, 'x') AND
w.type = o.type)
WHERE w.wo = 'W' AND
o.wo = 'O';
Выход
want1 want2 offer1 offer2 Type uidW uidO
a (null) a (null) KK 5 20
(null) b (null) b LL 30 13
a (null) a (null) KK 5 70
Демо-версия - http://sqlfiddle.com/#!9/e1ff2e/20
Для ваших конкретных данных:
select max(want1), max(want2), max(offer1), max(offer2),
max(case when 'W/O' = 'W' then uid end) as UID_W,
max(case when 'W/O' = 'O' then uid end) as UID_O
from t
group by coalesce(want1, offer1), coalesce(want2, offer2), 'W/O';
Это предполагает, что одна из двух последних строк действительно 'a', null, null
.