2010-04-03 74 views
0

剛剛進入SQL存儲查詢現在...反正存在的查詢作爲布爾的使用效果,這裏是我的數據庫架構(簡化爲您提供方便):SQL存儲查詢 - 基於記錄

member
------
id INT PK

board
------
id INT PK

officer
------
id INT PK

如果你到OOP,官繼承董事會成員繼承。換句話說,如果某人在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 ; 

錯誤的完整表述是 #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 

我懷疑的問題是在參數爲IF塊。我想要做的是返回true如果結果集至少有一個 - 即在表中找到id

你們有沒有人在這裏看到任何事情,或者我應該重新考慮我的數據庫設計:?

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

+0

如果成員,董事會和執行官員都是特權級別 - 他們應該被包含在一個單一的表。自動生成的順序int值不可靠 - 我在Priveleges表中有一列名爲「rank」或「weight」的列。那麼你可以使用聚合(MIN,MAX專門)... – 2010-04-03 03:44:40

+0

嗯。那麼,他們不只是*特權級別是事情。他們也有更多的數據,比如'officer'有一個'position'字段。我想我可以把'NULL'放在board和member中,或者把'position'放在另一個表中。 – 2010-04-03 22:01:31

回答

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 
     ...