2011-01-04 6 views
1

places라는 테이블이있는 표준 MySQL 5.1 데이터베이스가 있습니다. name과 name_bg라는 두 개의 열이 있습니다. 여기서 name은 장소의 영어 이름이고 name_bg는 장소의 불가리아 이름입니다.MySQL은 가장 짧은 결과를 먼저 표시하지 않습니다.

우리는 "РИМ"로 시작하는 두 개의 장소가 있습니다. "Рим"및 "Римини".

+--------+--------+--------------+ 
| id     | name   | name_bg      | 
+--------+--------+--------------+ 
| 221543 | Rimini | Римини       | 
|  34514 | Rome   | Рим          | 
+--------+--------+--------------+ 

은 다음과 같이 검색 할 때 :

select id, name from places where name like 'рим%'; 

또는이 같은 :

select id, name from places where name_bg like 'рим%'; 

모든 것이 잘 보인다. (GROUP BY 절)을 다음과 같이 검색 할 때

이상한 물건은 다음과 같습니다

SELECT places.name, places.name_bg, places.country_id, countries.continent_id WHERE places.name LIKE 'рим%' OR places.name_bg LIKE 'рим%' ORDER ("CHAR_LENGTH(places.name), CHAR_LENGTH(places.name_bg), countries.continent_id, places.popular DESC") GROUP BY country_id LIMIT 10 

쿼리 Рим 대신 처음 Римини를 반환합니다.

우리는 질의에 대한 순서와 그룹을 시도했지만 아무런 도움이되지 않았습니다.

장소의 ID를 전환했지만 동일한 결과가 발생했습니다.

우리는 먼저 단락 결과를 원합니다.

도움이 필요합니다. 당신이해야 기대하는 이유

최저

, 보르는

+0

왜 'name_bg'로 필터링하고 선택하지 않습니까? 이게 맞습니까? –

+0

전체 텍스트 검색을 고려해 보셨습니까? – shantanuo

답변

8

그것은 내게 분명하지 않다. length 기능이 필요한 기능을 수행합니까?

SELECT id, 
     name 
FROM places 
WHERE name_bg LIKE 'рим%' 
     OR name LIKE 'рим%' 
ORDER BY Length(name) 
+0

사례를 지나치게 단순화 한 것은 유감입니다. GROUP BY 문은 ORDER가 이상하게 만드는 이유입니다. 어떤 식 으로든 이걸로? – YavorIvanov

1

order by 절이 없으면 결과가 확실한 순서로 반환되지 않습니다. 이는 쿼리에서 쿼리로 변경 될 수 있습니다. 가장 짧은 결과를 원하면 길이 (결과)로 정렬하십시오.

2

order by 절이없는 select-query는 본질적으로 순서가 없습니다. 특정 주문이있는 것으로 보일 수 있으며, 일반적으로 동일한 결과가 발생합니다. 그러나 이것은 결과를 얻는 구현의 결과 일뿐입니다. 대부분의 경우 어떤 색인이 사용되는지 살펴봄으로써 예측할 수 있습니다. 그러나 이것에 어떤 방식으로도 의지해서는 안됩니다.

order by 절을 추가하여 결과 집합을 주문할 수 있습니다. 아마도 CHAR_LENGTH 함수를 사용합니다. 멀티 바이트 문자는 단일 문자로 간주됩니다. 캐릭터 라인의 길이가 동일하면, 순서는 미정 도리입니다. 예를 들어 결과가 알파벳순으로 정렬되도록하려는 경우입니다. name이라는 두 번째 절을 사용하십시오. 또한 사전 순 정렬은 collation에 의해 수행됩니다. 그래서 불가리아 식 질서에 의하면 불가리아 식 질서에 의해 명령된다.

관련 문제