Я думаю, вы ищете что-то вроде этого:
SELECT t.id, t.name_lowercase, t.latitude_decimal, t.longitude_decimal
FROM (SELECT MAX(LENGTH(name_lowercase)) AS len, latitude_decimal, longitude_decimal FROM temp_city GROUP BY latitude_decimal, lng) AS max_length,
temp_city t
WHERE max_length.latitude_decimal = t.latitude_decimal
AND max_length.longitude_decimal = t.longitude_decimal
AND max_length.len = LENGTH(t.name_lowercase);
Где temp_city
- таблица, содержащая ваши результаты выборки.
Приведенные выше проблемы могут привести кtemp_city
также содержит эту строку:
1 | xxxancia la sara | -53.4333333 | -68.1833333
Вы не предложили способ выбрать, какую строку из числа тех, чья name
имеет максимальную длину, поэтому оба они будут возвращены:
1 | xxxancia la sara | -53.4333333 | -68.1833333
935665 | estancia la sara | -53.4333333 | -68.1833333
ОБНОВЛЕНИЕ : Если max(tc.id)
является дополнительным критерием для обрезки вышеупомянутых дубликатов, то вы можете обернуть другой слой на:
SELECT t.id, t.name_lowercase, t.latitude_decimal, t.longitude_decimal
FROM
(
SELECT MAX(t.id) AS id
FROM
(
SELECT MAX(LENGTH(name_lowercase)) AS len, latitude_decimal, longitude_decimal
FROM temp_city
GROUP BY latitude_decimal, longitude_decimal
) AS max_length,
temp_city t
WHERE max_length.latitude_decimal = t.latitude_decimal
AND max_length.longitude_decimal = t.longitude_decimal
AND max_length.len = LENGTH(t.name_lowercase)
GROUP BY t.latitude_decimal, t.longitude_decimal, LENGTH(t.name_lowercase)
) AS tt,
temp_city t
WHERE t.id = tt.id