Вы можете использовать внутреннее объединение, сравнивая фразы с LIKE
, чтобы получить только те, которые содержатся в другой фразе.Фильтр для точки в предложении WHERE
.Затем получите rank()
, разделенный на фразу из объединенного экземпляра и упорядоченный по убыванию длины.Во внешнем SELECT
получают только те, которые имеют ранг 1.
SELECT x.id,
x.phrase,
x.points
FROM (SELECT w1.id,
w1.phrase,
w1.points,
rank() OVER (PARTITION BY w2.phrase
ORDER BY len(w1.phrase) DESC) r
FROM words w1
INNER JOIN words w2
ON w2.phrase LIKE concat(w1.phrase, '%')
WHERE w2.points = 0
AND w1.points > 0) x
WHERE x.r = 1;
SQL Fiddle
Редактировать:
Включить другую фразу:
SELECT x.id,
x.phrase,
x.other_phrase,
x.points
FROM (SELECT w1.id,
w1.phrase,
w2.phrase other_phrase,
w1.points,
rank() OVER (PARTITION BY w2.phrase
ORDER BY len(w1.phrase) DESC) r
FROM words w1
INNER JOIN words w2
ON w2.phrase LIKE concat(w1.phrase, '%')
WHERE w2.points = 0
AND w1.points > 0) x
WHERE x.r = 1;