mysql group by和having子句获取错误

时间:2012-02-02 14:05:22

标签: mysql

我在以下查询中收到错误,即使我的一切似乎都很好:

SELECT
    user.*
FROM
    user
INNER JOIN
    role ON role.id = user.role_id
LEFT OUTER JOIN
    user_documents ON user.id = user_documents.user_id 
WHERE
    user.id = 1
GROUP BY
    user.id 
HAVING
    count(user_documents.user_id) < role.max_allowed_documents

我得到的错误是Unknown column 'role.max_allowed_documents' in 'having clause',但我检查了三次,该列存在于我的角色表中。有什么想法吗?

基本上我将用户分配给角色。每个用户可以在角色表中通过max_allowed_documents定义许多文档,这是一个整数,此查询会尝试选择仍然允许拥有文档的所有用户(未达到其限制)。

2 个答案:

答案 0 :(得分:5)

http://dev.mysql.com/doc/refman/5.5/en/select.html

  

SQL标准要求HAVING必须仅引用列中的列   GROUP BY子句或聚合函数中使用的列。然而,   MySQL支持对此行为的扩展,允许HAVING   引用SELECT列表中的列和外部子查询中的列   好。

以下代码应该没问题:

SELECT
    user.*, role.max_allowed_documents
FROM
    user
INNER JOIN
    role ON role.id = user.role_id
LEFT OUTER JOIN
    user_documents ON user.id = user_documents.user_id 
WHERE
    user.id = 1
GROUP BY
    user.id 
HAVING
    count(user_documents.user_id) < role.max_allowed_documents

答案 1 :(得分:0)

SELECT
      user.*
   FROM
      user
         JOIN role 
            ON user.role_id = role.id
         LEFT JOIN
            ( select ud.user_id, count(*) as DocCount 
                 from user_documents ud
                 group by ud.user_id ) PreCounted
            on user.id = PreCounted.user_id
   WHERE
      COALESCE( PreCounted.DocCount, 0 ) < role.max_allowed_documents