选择不是“*用户名*”的值

时间:2011-03-22 08:51:51

标签: mysql phpmyadmin

我的问题是: 我需要从“groups”表中选择不包含特定“user_id”的值。 所以我执行这个:

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值,即使它被隐藏为标记。  我曾多次尝试更改此查询,但我无法弄清楚这个简单的问题。

2 个答案:

答案 0 :(得分: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       

答案 1 :(得分:0)

您可以使用“必须”对JOIN结果应用条件。我也会使用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 

如果您发布表格结构,一些示例数据和一个示例想要的输出,您将获得更好的响应与工作查询......