Предположим, что вы хотите получить все user_id и даты от пользователей, которые провели пальцем к user_id 1 , но только если он (она) проводил этого пользователя тоже, а не влево.
Так немного расширив вашу таблицу:
swp_by swp_to swp_type swp_date
8 1 top ...
8 4 top ... <not
11 1 top ...
1 8 top ...
1 11 top ...
20 1 top ... < not
1 40 top ... < not
1 41 left ... < not
Первая часть: выберите из списка пользователя 1 swp_by = 1
все свайпы, которые не остались (аналогично вашему первому запросу):
// :mem = 1
SELECT swp_id, swp_by, swp_to, swp_date
FROM swipes
WHERE swp_by = :mem AND swp_type <> "left"
Результат 1:
swp_by swp_to swp_type swp_date
1 8 top ...
1 11 top ...
1 40 top ... <not
Вторая часть: найти все пролистывания «назад» на пользователя 1 , где swp_to = 1
// :mem = 1
SELECT swp_id, swp_by, swp_to, swp_date
FROM swipes
WHERE swp_to = :mem AND swp_type <> "left"
Результат 2:
swp_by swp_to swp_type swp_date
8 1 top ...
11 1 top ...
20 1 top ... < not
Теперь вы можете перекрестно ссылаться на результаты, находя swp_to
числа из Результат 1 (8 , 11, 40), которые имеют swp_by
в Результат 2 (8, 11, 20). Это можно сделать, используя LEFT JOIN
из той же таблицы
//this, in combination with WHERE, gives Result 1
SELECT R1.swp_id, R1.swp_to, R1.swp_type , GREATEST(R1.swp_date,R2.swp_date)
FROM swipes AS R1
//cross reference with Result 2
LEFT JOIN swipes AS R2
ON (
//look for those records where R1.swipe_to = R2.swipe_by
R1.swp_to = R2.swp_by
AND
//swipe_to from Result 2 has to be user 1
R2.swp_to = R1.swp_by
AND
//no left swipes in Result 2
R2.swp_type <> "left"
)
WHERE
//look only at the records from user 1...
R1.swp_by = :mem
AND
//...that are not empty
R2.swp_by IS NOT NULL
AND
//... that not are left
R1.swp_type <> 'left'
ORDER BY R1.swp_id DESC
Вот новая скрипка * РЕДАКТИРОВАТЬ ОП требуемая последняя дата, скорректированная с помощью GREATEST
на дату