2013-04-20 54 views
0

嗯,我已經建立了下面的表格(僅涉及列)SQL查詢選擇禁令名單上,孩子和父親加入

表論壇:

 
id | forumname | relatedto 
------------------------------ 
1 | games  | 0 
2 | action games | 1  // subforum of forum games 
3 | rpg games | 1  // subforum of forum games 

表banlist

 
id | useraid | forumid 
---------------------- 
1 | 56  | 1   // the user 56 got banned from forum games 

我想要做的是建立一個功能,看看用戶是否被禁止在論壇X,如果他被禁止,他認爲被禁止與論壇X有關的論壇。例如:用戶56也被禁止從論壇RPG遊戲。

我已經寫一個沒有工作的以下查詢:

 

    SELECT 
    f.id, 
    f.relatedto, 
    b.useraid as u1, 
    b2.useraid as u2 
    FROM forums f 
    LEFT JOIN banlist b ON(b.forumid=f.id and b.useraid='56') 
    LEFT JOIN banlist b2 ON(b2.forumid=f.relatedto and b2.useraid='56') 
    WHERE f.id='2' 

任何想法?

+1

結果集應該是什麼樣子? – Strawberry 2013-04-20 22:39:23

+0

只顯示1,如果禁用,則爲0。我建立的查詢是一個嘗試。 – GuyChabra 2013-04-20 22:40:42

+0

是否有父母對子女(例如孫輩)的嵌套級別或者只是一個級別?因爲您使用的是MySQL,所以單一級別會更容易。順便說一句 - 當前查詢將始終返回一個記錄,如果它存在於論壇表中。 – sgeddes 2013-04-20 22:44:32

回答

1

所以像...

SELECT f.* FROM forums f JOIN banlist b ON b.forumid = f.id OR b.forumid = f.parent_id; 

...?

+0

你給了我一個很好的領導。 – GuyChabra 2013-04-20 22:57:19

0

我想你的查詢是非常接近假設你想返回的結果,如果用戶沒有被禁止,不希望返回的結果,如果用戶被禁止:

SELECT * 
FROM forums f 
    LEFT JOIN banlist b ON f.id = b.forumid AND b.useraid = 56 
    LEFT JOIN banlist b2 ON f.relatedto = b2.forumid AND b2.useraid = 56 
WHERE b.id IS NULL 
    AND b2.id IS NULL 
    AND f.id = 2 

SQL Fiddle Demo

您可能需要爲您的IS NULL支票使用OR - 取決於您想要的結果(如果孩子被禁止但父母不是這種情況)。

0

我找到了答案。

SELECT 
    f.id, 
    count(b.id) AS isbanned 
FROM forums f 
LEFT JOIN banlist b 
    ON (
    (
     b.forumid = f.id OR b.forumid = f.relatedto 
    ) 
    AND userid = '$userid' 
) 
WHERE f.id = '$forumid' 
0

要確定用戶是否被禁用,可以創建一個函數或一個傳遞它的過程。

創建PROC userstatus @useraid INT 作爲 IF(SELECT COUNT(*)FROM BANLIST WHERE USERAID = @USERAID)> 0 BEGIN PRINT 」 USER被禁止」 ELSE PRINT ‘USER沒有被禁止’ END