2009-10-19 4 views
34

'cards'라는 INNODB 테이블에 약 20,000 개의 행이 있으므로 FULLTEXT는 옵션이 아닙니다. 내가의 순서로 결과 집합 원하는, 그래서MySQL - 어떻게 관계를 주문 하시겠습니까? INNODB 테이블

id  |  name  |  description 
---------------------------------------------------------- 
1  John Smith  Just some dude 
2  Ted Johnson  Another dude 
3  Johnathan Todd This guy too 
4  Susan Smith  Her too 
5  Sam John Bond And him 
6  John Smith  Same guy as num 1, another record 
7  John Adams  Last guy, promise 

'존'에 대한 사용자 검색 말 :

이 테이블을 고려하시기 바랍니다

7  John Adams 
6  John Smith 
3  Johnathan Todd 
5  Sam John Bond 
2  Ted Johnson 

주의를하는 우리 한 번만 '존 스미스 (John Smith)'를 끌어 들였고, 우리는 가장 최근의 항목을 가져갔습니다. 내 데이터 때문에 모든 이름은 똑같은 사람을위한 것이므로 John Smith라는 이름의 2 명의 다른 사람들에 대해 걱정할 필요가 없습니다. 아이디어? 내가 무엇인가를 명확히 할 수 있는지 알려줘.

+1

당신은하지 관련성 (그러나 당신이되도록 정의) "성, 이름"으로 주문 할 것으로 보인다. 이 올바른지? – Tomalak

답변

110

버전 1 :

SELECT max(id) id, name 
    FROM cards 
WHERE name like '%John%' 
GROUP BY name 
ORDER BY CASE WHEN name like 'John %' THEN 0 
       WHEN name like 'John%' THEN 1 
       WHEN name like '% John%' THEN 2 
       ELSE 3 
      END, name 

버전 2 :

SELECT max(id) id, name 
    FROM cards 
WHERE name like '%John%' 
GROUP BY name 
ORDER BY CASE WHEN name like 'John%' THEN 0 
       WHEN name like '% %John% %' THEN 1 
       WHEN name like '%John' THEN 2 
       ELSE 3 
      END, name 
+0

굉장! 그것은 내가 원했던 것과 똑같이 작동합니다. 감사합니다 najmeddine! – k00k

+1

도와 드리겠습니다. 더 많은 경우를 처리하기 위해 약간 수정했습니다. – manji

+0

다른 방법은 내 구체적인 경우에 더 잘 작동한다고 생각하지만 둘 다 다른 사람들에게 도움이 될 수 있습니다. 후손을 위해 둘 다 올려 놓을 수 있습니까? – k00k

관련 문제