2010-04-03 1 views
0

의 존재에 따라 부울 쿼리의 사용 결과는 여기 (귀하의 편의를 위해 간체) 내 데이터베이스 스키마의
id INT의 PKSQL 저장된 쿼리 그냥 ... 어쨌든 지금 SQL 저장 질의에 들어가기 기록

board
------
id INT의 PK

,617 당신은 OOP에 경우

officer
------
id INT의 PK

, 경관 상속 보드 상속 회원. 즉, 누군가가 officer 테이블에 나열되면 board 테이블과 member 테이블에 나열됩니다. 누군가가 가지고있는 최고 수준의 특권을 찾고 싶습니다. 지금까지 내 SP는 다음과 같습니다

DELIMITER // 
CREATE PROCEDURE GetAuthLevel(IN targetID MEDIUMINT) 
    BEGIN 
     IF 
      SELECT `id` 
      FROM `member` 
      WHERE `id` = targetID; 
     THEN 
      IF 
       SELECT `id` 
       FROM `board` 
       WHERE `id` = targetID; 
      THEN 
       IF 
        SELECT `id` 
        FROM `officer` 
        WHERE `id` = targetID; 
       THEN 
        RETURN 3; /*officer*/ 
       ELSE 
        RETURN 2; /*board member*/ 
      ELSE 
       RETURN 1; /*general member*/ 
     ELSE 
      RETURN 0; /*not a member*/ 
    END // 

DELIMITER ; 

오류의 정확한 텍스트 내가 문제는 IF 블록에 대한 인수에 의심 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

'SELECT id 
    FROM member 
    WHERE id = targetID; 
THEN 
    IF 
     SEL' at line 4 

입니다. 결과 집합이 하나 이상 (예 : id) 인 경우 return true을 반환합니다.

여러분 중 아무 것도 여기를 보지 않습니까, 아니면 내 데이터베이스 디자인을 다음과 같이 재검토해야합니까?

person
------
id INT의 PK
level SMALLINT

+0

회원, 보드 및 임원 모든 권한 수준 인 경우 - 그들은 하나의 테이블에 포함되어야한다가. 자동 생성 된 순차 int 값은 신뢰할 수 없습니다. Priveleges 테이블에 "rank"또는 "weight"라는 열이 있습니다. 그럼 집계 (MIN, MAX 구체적으로)를 사용할 수 있습니다 ... –

+0

흠. 음, 그들은 단지 * 특권 레벨이 아닙니다. 그들은 또한 더 많은 데이터를 가지고 있습니다. 예를 들어'officer'는'position' 필드를 가지고 있습니다. 나는 널과 멤버를 위해서'NULL'을 넣을 수도 있고,'position'을 다른 테이블로 넣을 수도 있습니다. –

답변

1
CREATE PROCEDURE GetAuthLevel(IN targetID MEDIUMINT) 
    BEGIN 

    DECLARE var INT; 

    SELECT `id` INTO var 
    FROM `member` 
    WHERE `id` = targetID; 

    IF var IS NOT NULL THEN 
     ...