SELECT mm.*
FROM myTable mm
LEFT JOIN myTable m
ON mm.UserId = m.UserId
AND (m.to = :contactNumber OR m.from = :contactNumber)
AND mm.x < m.x
WHERE mm.userId = :userId
AND (mm.to = :contactNumber OR mm.from = :contactNumber)
AND m.userId IS NULL
Это использует известный метод для поиска максимальных или минимальных значений, используя левое соединение к себе.В основном техника выглядит следующим образом:
SELECT a.*
FROM a
LEFT JOIN a AS a2 ON a.key = a2.key AND a.value < a2.value
WHERE a2.key IS NULL
Возвращает все строки из a
с максимальными значениями value
для каждого key
.Для минимума вы бы просто заменили <
на >
.