2012-09-11 3 views
1

데이터베이스에 문자열 변수를 'Abstain', 'Block', 'No'또는 'Yes'로 저장했습니다. 현재 나는 알파벳 순서 대신 ORDER BY position을 사용하여 이들을 잡아 내고 있습니다. '차단', '아니오', '금지', '예'와 같은 순서로 주문하고 싶습니다. Rails에서이 작업을 수행하는 쉬운 방법이 있습니까? 이것에 대한데이터베이스의 문자열 이름순으로 정렬

내 정확한 코드는 다음과 같습니다

def self.unique_votes(motion) 
    Vote.find_by_sql("SELECT * FROM votes a WHERE created_at = (SELECT MAX(created_at) as created_at FROM votes b WHERE a.user_id = b.user_id AND motion_id = #{motion.id}) ORDER BY a.position") 
end 

NB : 내가 포스트 그레스 SQL을 사용하고 내가 선택 문 감사에서 사용할 수있는 솔루션을 찾고 있어요!

+0

'블록, 아니 기권, Yes' : 어떻게 당신이 순서를 정의 했습니까? – oldergod

+0

저는 현재 데이터베이스에있는 문자열에 불과합니다. 내 질문입니다. 알파벳 순서가 아닌 순서를 어떻게 정의 할 수 있습니까? 불분명하다면 미안 해요! –

답변

7

이렇게하는 방법 중 하나입니다. 그런데 가장 좋은 방법은 "Position" 테이블의 기본 키를 참조하는 "votes" 테이블의 숫자와 외래 키로 모든 값을 식별하는 "Position"이라는 테이블을 만드는 것입니다. 또한 이라는 다른 열을 "Position" 테이블에 저장하여 해당 숫자를 저장하고 정렬 할 수 있습니다. 삽입 할 때마다 이러한 작업을 수행해야하며 모든 선택 작업을 수행해야합니다.

건배

SELECT * 
, Case a.position 
     When 'Block'  Then 0 
     When 'No'  Then 1 
     When 'Abstain' Then 2 
     When 'Yes'  Then 3 
     Else -1 
    End      As Position_Value 
    FROM votes a 
    WHERE created_at = (
     SELECT MAX(created_at) as created_at 
      FROM votes b 
      WHERE a.user_id = b.user_id 
      AND motion_id = #{motion.id} 
    ) 
    ORDER BY Position_Value 

예상대로 작동하지 않는 경우 어떤 방법을! 당신은 시도 할 수 있습니다이 하나 : 나는 부 자연스러운 순서로 정렬 할 필요가 일련있을 때마다

Select * 
    From (
     SELECT * 
    , Case a.position 
      When 'Block'  Then 0 
      When 'No'  Then 1 
      When 'Abstain' Then 2 
      When 'Yes'  Then 3 
      Else -1 
     End      As Position_Value 
     FROM votes a 
     WHERE created_at = (
      SELECT MAX(created_at) as created_at 
       FROM votes b 
       WHERE a.user_id = b.user_id 
       AND motion_id = #{motion.id} 
     ) 
    ) As Result 
    ORDER BY Position_Value 
+0

이 정확한 문구를 내 응용 프로그램에서 시도해 보았지만 작동하지 않았습니다. "As Position_Value"는 switch 문에서 벗어났습니다. 이것은 나를 위해 최선의 방법으로 보인다. –

+0

"작동하지 않았습니다."무슨 일이 일어 났는지 알 수있는 완전한 참고 자료가 아닙니다. 오류가 무엇인지 말해 주시겠습니까? – Rikki

+0

죄송합니다. 코드 측면에는 오류가 없었지만 적용된 주문이없는 것으로 보입니다. 내가받은 진술은 그것을 잘못된 방향으로 명령하고 있었다. –

2

영구적 인 요구 사항 인 경우 원하는 순서대로 인쇄 할 번호가있는 '주문'열을 다른 테이블에 저장하고 결과를이 테이블과 ORDER BY 주문 열에 결합 할 수 있습니다.

임시 인 경우 결과와 값을 선택하고 순서 지정 열을 기준으로 정렬하는 SQL 문의 묶음으로 결과를 결합 할 수 있습니다.

+0

그래서 임시 주문 테이블을 만들어야한다는 제안이 있습니까? 이것은 영구적 인 요구 사항이 아니며 더 큰 응용 프로그램의 한 부분에만 적용해야합니다. 문자열을 정렬 할 수있는 "ORDER BY"문에 대한 몇 가지 사항을 보았습니다. –

4

, 나는 추가 정수 필드를 추가, 내가 원하는 순서로 문자열 값을 강제로 그 그것으로 값을 넣어 그들.

'Abstain' 
'Block' 
'No' 
'Yes' 

내가 두 번째 필드 거라고 :

대신에만있는의

'Abstain' 3 
'Block' 1 
'No'  2 
'Yes'  4 

두 번째 열에서 정렬을 내 원하는 순서대로 값을 검색 할 날 수 있습니다 :

'Block' 1 
'No'  2 
'Abstain' 3 
'Yes'  4 
+0

매우 유용하고 유용한 제안에 감사드립니다. 그러나 어쨌든이 단계에서 데이터베이스 스키마를 변경할 수 없습니다. –

+0

이것은 내 응용 프로그램에서 수행하는 것입니다 게다가. –

+1

@LearningDev, 그런 다음 해당 기준을 질문에 넣어야합니다. –

0

MySQL의 FIELD 함수와 같은 것을 정의 할 수 있습니다. 즉, 인덱스를 검색 할 수 있습니다. 배열을 입력 한 다음 ORDER BY에 사용하십시오. 배열보다 조금 간결합니다.

참조 : https://stackoverflow.com/a/12366184/398670

관련 문제