2011-03-22 30 views
0

我的問題是這樣的: 我需要從「組」表中選擇不包含特定「user_id」的值。 所以我執行此:選擇的值不是「* username *」

SELECT DISTINCT group.active, hide_group.user_id, group.group_id, hide_group.hide, group.desc AS group_desc 
FROM group 
LEFT JOIN hide_group ON hide_group.group_id = group.group_id 
WHERE (
hide_group.user_id != 'testuser' 
OR hide_group.user_id IS NULL 
AND (
hide != 'true' 
OR hide IS NULL 
) 
) 
AND active =1 
ORDER BY `group`.`group_id` ASC 
LIMIT 0 , 500 

但現在可以說,我們已經在我的「group_hide」表中有這樣的記載:

[group_hide] 
(user_id, group_id, hide) 
john, ABC, true; 
joe, ZZZ, true; 
mark, ABC, true; 

所以現在,當我做我的查詢,馬克仍然可以看到ABC組,因爲該條件是真實且有效的,因爲user_id = john,並且我們爲此採用ABC值,即使它是隱藏標記的。 我試過多次改變這個查詢,但我找不出這個簡單的問題。

+0

另請參閱[此問題](http://stackoverflow.com/questions/5353532/combining-sum-組通過和左聯接-回報,不正確,成果如何對修復/ 5354267#5354267) – jswolf19 2011-03-22 09:21:21

回答

2

我建議使用子查詢:

SELECT * 
FROM group 
WHERE group_id NOT IN (
    SELECT group_id 
    FROM group_hide 
    WHERE user_id = 'testuser' 
    AND hide = true) 
AND active =1 
ORDER BY `group`.`group_id` ASC 
LIMIT 0 , 500  
0

您可以使用具有適用於連接結果的條件。我也會使用GROUP BY而不是DISTINCT。

我不知道我完全按照你的WHERE條件(我想你有一些查詢股價與括號),但在這裏可以得到你需要的結果的一個版本:

SELECT DISTINCT group.active, hide_group.user_id, group.group_id, hide_group.hide, group.desc AS group_desc 
FROM group 
LEFT JOIN hide_group ON hide_group.group_id = group.group_id 
WHERE active =1 
HAVING (hide_group.user_id != 'testuser' 
     OR hide_group.user_id IS NULL) 
     AND 
     (hide != 'true' 
     OR hide IS NULL) 
ORDER BY `group`.`group_id` ASC 
LIMIT 0 , 500 

如果你發佈表結構,一些樣本數據和樣本想要的輸出,您將得到更好的工作查詢響應...