2010-04-03 65 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 
     ...