2010-04-13 2 views
1

taggings라는 조인 테이블을 통해 질문에 많은 태그가 있다고 가정 해 봅니다. 나는 이렇게 가입 않습니다 : 그 피아노 맨 위에 오도록SQL : 조인에서 오른손 값 수집

SELECT DISTINCT `questions`.id 
FROM `questions` 
LEFT OUTER JOIN `taggings` 
    ON `taggings`.taggable_id = `questions`.id 
LEFT OUTER JOIN `tags` 
    ON `tags`.id = `taggings`.tag_id 

내가, 예를 들어, '피아노', 특정 태그 이름에 따라 결과를 정렬하려면, 다음 알파벳 순서에있는 다른 모든 태그에 의해. 현재 나는이 주문 절 사용하고 있습니다 : 완전히 잘못된 것입니다

ORDER BY (tags.name = 'piano') desc, tags.name 

를 - 심지어 전혀 '피아노'태그되지 않은 돌아가 첫 번째 결과를. 내 문제는 내가 어떻게 든 태그 이름을 그룹화하고 그에 대한 내 주문 테스트를 할 필요가 있다고 생각합니다 : 나는 결과를 조인 테이블의 구조로 인해 직선 tags.name에 대한 작업을하지 않는 것 같아요 (그것은 작동하지 않습니다 만약 내가 태그 테이블에 간단한 선택을 할)하지만 난 그것을 고칠 주위에 내 머리를 얻을 수 없습니다. 어떤 조언에 감사

는 최대

편집 - 내가 전에 본 않았다 - 마르셀에 대한 응답은 많은 마르셀로가 감사 COALESCE 다시. api를 더 올바르게 읽어야합니다. 이것은 사실 도움이되지만 coal 節도 선택해야합니다. 즉,

SELECT DISTINCT `questions`.id 
FROM `questions` 
LEFT OUTER JOIN `taggings` 
    ON `taggings`.taggable_id = `questions`.id 
LEFT OUTER JOIN `tags` 
    ON `tags`.id = `taggings`.tag_id 
ORDER BY (COALESCE(tags.name,'') = 'piano') desc, tags.name 

은 여전히 ​​가짜 결과를냅니다. 그러나 :

SELECT DISTINCT `questions`.id, COALESCE(tags.name,'') 
FROM `questions` 
LEFT OUTER JOIN `taggings` 
    ON `taggings`.taggable_id = `questions`.id 
LEFT OUTER JOIN `tags` 
    ON `tags`.id = `taggings`.tag_id 
ORDER BY (COALESCE(tags.name,'') = 'piano') desc, tags.name 

올바른 결과를 반환합니다. 그래도 질문 ID를 선택하고 싶습니다. 어쨌든 가까워지면 확실히 ...

답변

2

tags.name = 'piano'은 이 NULL 일 때 NULL으로 표시 될 수 있습니다. 시도하십시오 COALESCE(tags.name, '') = 'piano'.