2010-02-05 4 views
1

내 데이터베이스에는 악기 이름 (및 다양한 기타 속성)이 저장됩니다. id이 기본 키이고 name이 고유 키라고 가정 해 보겠습니다. PHP 스크립트에서 임의의 순서로 SQL 행 출력 정렬?

, 정말처럼, 자신의 악기 클래스에서 항목을 선택합니다

$name = mysql_real_escape_string($_POST['name']); 
$row = mysql_fetch_row(mysql_query("SELECT * FROM `instruments` WHERE name LIKE '%$name%' ORDER BY id")); 

결과 테이블 :

id name 
1  "Flute 2" 
2  "Bass Flute" 
3  "Flute 10" 
4  "Flute 7" 

이처럼, 나 악기의 전체 제품군을 선택할 수 있습니다 소프라노 색소폰 ","알토 색소폰 "등"색소폰 "을 쿼리하는 것만으로도 가능합니다.

해당 특정 예에서 결과는 해당 id (auto_incremented라고 가정 할 수 있음)에 의해 표시됩니다. 알파벳 순서로 주문하는 것이 더 이상적일까요?

id name 
2  "Bass Flute" 
3  "Flute 10" 
1  "Flute 2" 
4  "Flute 7" 
잘 작동하지만있는 음악가, 그들은 DB 관리자와 함께 주변 나사, 그리고 플루트 결과에 "플루트"위에 나열된 "베이스 플루트"를 가진받지 않는

정말 "Flute 2"앞에 "Flute 10"이 표시되지 않도록주의하십시오.

따라서 ORDER BY score_order이 없으므로 (너무 쉽지는 않을 것입니다 ...) 악기를 올바르게 표시하기 위해 일종의 정렬 시스템을 어떻게 도입 할 수 있습니까?

브레인 스토밍을 할 때 나는 하나의 해결책을 찾았습니다. integer 유형의 열을 하나 더 추가하고 악기의 중요도에 따라 "계급"할 수 있습니다 (즉, Piccolos는 "1", Flutes "2" 등) :

... nts` WHERE name LIKE '%$name%' ORDER BY rank, name")); 

id name   rank 
3  "Flute 10"  2 
1  "Flute 2"  2 
4  "Flute 7"  2 
2  "Bass Flute" 5 

그러나,이 "플루트 (10)는" "플루트 2 '앞에 오는 사실, 영숫자 고려하지 않습니다.

이상적인 결과 테이블 (name에 의해 다음 rank에 의해 주문 등) :

id name   rank 
6  "Piccolo"  1 
1  "Flute 2"  2 
4  "Flute 7"  2 
3  "Flute 10"  2 
5  "Alto Flute" 4 
2  "Bass Flute" 5 

그래서, 내 질문 :

  1. 이것이 가능한 솔루션이며, 노력이 가치가있다 도구?
  2. 숫자가 아닌 숫자 대신 전체 숫자를 분석하여 SQL 주문 레코드를 가질 수 있습니까?

고마워요!

답변

1

그것은 당신의 이상적인 정렬 순서가 어떻게 될지 나에게 완전히 명확하지 않다,하지만 당신은 아마 그냥 데이터베이스 테이블에 여분의 열을해야한다. 당신은 ORDER BY score_order이 너무 쉬울 거라고 말하지만, 명시 적으로 score_order 필드와 순서를 추가하지 않으시겠습니까?

+0

좋은 지적입니다. 이상적으로, 악기 thusly 히 나열됩니다 : 플루트 1 플루트 2 플루트 3 알토 플루트 베이스 플루트 ...'score_order' 필드에 의해 주문은 여전히 ​​영숫자 것, 그것은 확실히 아니다 내가 찾고있어. –

+0

나는 좀 더 시각화 할 수 있도록 예제 테이블을 질문에 추가했습니다. 감사합니다 :) –

+0

'score_order'를 영숫자가 아닌 숫자 필드로 만들 수 있습니까? ('score_order'는 악기가 악보에 나오는 순서라고 가정하고 있는데, 잘못 해석 했습니까?) –

1

내가하는 일은 테이블에 "우선 순위"열을 넣는 것입니다. 그런 다음 가장 중요한 순서대로 연주하십시오 (예 : 기본 악기는 플루트, 색소폰 등). 수정은 1 : Bass Flute, Alto Flute 등이되며 Numerics의 우선 순위는 숫자 + 100 또는 끝이지만 여전히 숫자 순서대로).

숫자를 정렬하고 (동일한 우선 순위의 경우 영문자 순으로) 숫자를 사용하는 것이 가장 좋은 방법은 숫자를 사용하는 것입니다.

편집 :
플루트 (0)
베이스 플루트 (1)
테너 플루트 (1)
플루트 1 (101 : 그래서, 위의 당신이 뭔가를 (우선 순위가 parentheis에) 줄 것이다)
플루트 2 (102)
플루트 (10) (110)

+0

그래서 유형 문자열로 정렬하면 MySQL은 영숫자로 주문하지만 정렬 순서에 따라 정렬 된 열이 정수 유형 인 경우 그렇게하지 않습니까? 흥미로운 ... 그러나 작품에 스패너를 던지려면 숫자가 결과 세트에 통합되어야하므로 모든 "플루트"는 함께 있고 모든 "알토 플루트"는 숫자와 관계없이 함께 있습니다. –

+0

당신이 우선 순위를 정하는 것이므로 주문을 할 수 있도록 설정할 수 있습니다. 당신의 쿼리에서 당신은 단지 "ORDER BY 우선 순위 ASC, ASC 이름"을 넣을 것입니다. – Brad

7

이와 같이 다른 순서를 만들 수 있습니다. 그것은 해킹입니다.

select * from table 
order by (
    case name 
    when 'Health' then 0 
    when 'Flute 10' then 1 
    when 'Freeze' then 2 
    when 'Bass Flute' then 3 
    end 
) 

id 열을 사용하는 것이 좋습니다.

select * from table 
order by (
    case id 
    when 3 then 0 
    when 1 then 1 
    when 4 then 2 
    when 2 then 3 
    end 
)