Проблема заключается в последовательности сортировки, используемой в вашей базе данных. Существует огромное количество информации о последовательностях сортировки в зависимости от вашей RDBMS. Вы должны быть очень осторожны при изменении последовательности сортировки, поскольку это может привести к непредвиденным последствиям.
Последовательность сортировки используется для проверки равенства или неравенства столбцов. В зависимости от используемой сортировки следующие операторы могут быть оценены как true или false:
'TexT' = 'text'
'TEXT' = 'text'
'áéíóú' = 'aeiou'
В вашей ситуации вам нужно будет выбрать последовательность сортировки, в которой буквы с акцентом и обычные буквы будут рассматриваться как разные значения. В настоящее время ваша база данных определяет, что они равны. Как только вы это сделаете, вы сможете разработать свою логику для выбора подходящего значения на основе предпочитаемого вами culture
Просто добавьте, что ваша база данных в настоящее время определяет, что Paris = París
, и я подозреваю, что нет гарантии, что будет выбрано отдельное значение, аналогично тому факту, что нет определенного порядка набора результатов, если только Используется предложение ORDER BY.
Я немного подумал об этом. Я думаю, что лучше всего было бы создать CultureRank
CREATE TABLE CultureRank
(
Rank INTEGER,
Culture VARCHAR(5)
);
INSERT INTO CultureRank VALUES (1, 'es_ES');
INSERT INTO CultureRank VALUES (2, 'en_GB');
INSERT INTO CultureRank VALUES (3, 'pt_BR');
INSERT INTO CultureRank VALUES (4, 'pt_PT');
SELECT
Name
FROM
City_i18n
LEFT JOIN CultureRank ON City_i18n.Culture = CultureRank.Culture
WHERE
ID = 2745
AND City_i18n.Culture IN ('es_ES', 'pt_PT') -- If Required
ORDER BY
IF(ISNULL(CultureRank.Culture),1,0),
CultureRank.Rank
LIMIT 1;
ORDER BY ISNULL требуется, если в city_i18n будут присутствовать культуры, которых нет в CultureRank. Функция IsNull здесь гарантирует, что культурам в таблице CultureRank будет присвоен высший приоритет, а затем, если ни один из них не связан с городом, механизм выберет случайную культуру из таблицы city_i18n для этого города. Если вы предпочитаете, чтобы культуры, которых нет в CultureRank, были приоритетными, поменяйте местами параметры 1 и 0 в функции ISNULL.
EDIT:
SELECT
Name
FROM
City_i18n
LEFT JOIN CultureRank ON City_i18n.Culture = CultureRank.Culture
WHERE
ID = 2745
AND City_i18n.Culture IN ('es_ES', 'pt_PT') -- If Required
AND NOT EXISTS (
SELECT
NULL
FROM
City_i18n Cities
LEFT JOIN CultureRank CitiesRank ON Cities.Culture = CitiesRank.Culture
WHERE
City_i18n.Name = Cities.Name
AND CultureRank.Rank < CitiesRank.Rank)
Это должно дать вам каждое имя из таблицы City_i18n для данного идентификатора, если только нет другой записи с таким же именем, основанной на последовательности сортировки, которая имеет более высокий ранг в таблице CultureRank.