Sql 对

Sql 对,sql,Sql,IFNULL()仅用于返回0,因为在这种情况下,没有合适的用户将呈现NULL值。我不确定MySQL中如何处理布尔值,因为它本身不支持布尔值。我想我应该从一个子查询开始,该子查询生成以下项的(不相交)并集: 公司ID和(非零)可以访问系统的用户计数,其中至少有一个用户可以访问系统 没有用户可以访问系统时的公司ID和零计数 假设User.CanAccessSystem为空是解释左连接所需的人工制品,则会导致: SELECT Company.ID, COUNT(*) AS UserCount

IFNULL()仅用于返回0,因为在这种情况下,没有合适的用户将呈现NULL值。我不确定MySQL中如何处理布尔值,因为它本身不支持布尔值。

我想我应该从一个子查询开始,该子查询生成以下项的(不相交)并集:

  • 公司ID和(非零)可以访问系统的用户计数,其中至少有一个用户可以访问系统
  • 没有用户可以访问系统时的公司ID和零计数
假设
User.CanAccessSystem为空
是解释左连接所需的人工制品,则会导致:

SELECT Company.ID, COUNT(*) AS UserCount
    FROM Company, User
    WHERE Company.ID = User.CompanyID
      AND User.CanAccessSystem = true
UNION
SELECT Company.ID, 0 AS UserCount
    FROM Company
    WHERE NOT EXISTS (SELECT * FROM User
                         WHERE Company.ID = User.CompanyID
                           AND User.CanAccessSystem = true)
您可以使用“AND Company.CanAccessSystem=true”过滤这两个部分,如果大多数公司无法访问该系统,或者您可以将其推迟到最后的处理阶段,这可能是有益的

然后,您需要将此结果与公司直接连接,确保公司能够访问系统的过滤条件应用于该线路的某个位置

名义上,这会导致以下(未测试)代码:


我想我应该从一个子查询开始,该子查询生成以下项的(不相交)并集:

  • 公司ID和(非零)可以访问系统的用户计数,其中至少有一个用户可以访问系统
  • 没有用户可以访问系统时的公司ID和零计数
假设
User.CanAccessSystem为空
是解释左连接所需的人工制品,则会导致:

SELECT Company.ID, COUNT(*) AS UserCount
    FROM Company, User
    WHERE Company.ID = User.CompanyID
      AND User.CanAccessSystem = true
UNION
SELECT Company.ID, 0 AS UserCount
    FROM Company
    WHERE NOT EXISTS (SELECT * FROM User
                         WHERE Company.ID = User.CompanyID
                           AND User.CanAccessSystem = true)
您可以使用“AND Company.CanAccessSystem=true”过滤这两个部分,如果大多数公司无法访问该系统,或者您可以将其推迟到最后的处理阶段,这可能是有益的

然后,您需要将此结果与公司直接连接,确保公司能够访问系统的过滤条件应用于该线路的某个位置

名义上,这会导致以下(未测试)代码:


我没有安装MySQL。。。在MSSQL上尝试过这个,我相信,这将处理您的场景,只需稍加修改就可以使MySQL生效

SELECT c.CompanyID, c.CompanyName, SUM(CASE u.CanAccessSystem WHEN 1 then 1 else 0 end) 
FROM Company c LEFT OUTER JOIN
    [User] u
ON u.CompanyID = c.CompanyID
WHERE c.CanAccessSystem = 1
GROUP BY c.CompanyID, c.CompanyName

我没有安装MySQL。。。在MSSQL上尝试过这个,我相信,这将处理您的场景,只需稍加修改就可以使MySQL生效

SELECT c.CompanyID, c.CompanyName, SUM(CASE u.CanAccessSystem WHEN 1 then 1 else 0 end) 
FROM Company c LEFT OUTER JOIN
    [User] u
ON u.CompanyID = c.CompanyID
WHERE c.CanAccessSystem = 1
GROUP BY c.CompanyID, c.CompanyName

您是否刚刚使用了我的部分代码(COALESCE…),然后否决了我?如果您执行“插入公司值('mine',5,1);”,这是否正确?它应该列出没有用户的公司“我的”。@Tomalak,没有。@Jonathan,没有。不与没有用户的公司合作。但问题的规格没有说明是否需要这样做。也许是这样。你是否只是使用了我的部分代码(COALESCE…),然后否决了我?如果你“插入公司值('mine',5,1);”,这是否正确?它应该列出没有用户的公司“我的”。@Tomalak,没有。@Jonathan,没有。不与没有用户的公司合作。但问题的规格没有说明是否需要这样做。可能是这样的。没有用户的公司被算作只有一个用户,不是吗?没有用户的公司被算作只有一个用户,不是吗?这可能涵盖了一切。这可能涵盖了一切 mysql> select * from companies; +------+------------+-----------+ | name | company_id | canaccess | +------+------------+-----------+ | foo | 1 | 1 | | bar | 2 | 1 | | baz | 3 | 1 | | quux | 4 | 1 | +------+------------+-----------+ 4 rows in set (0.00 sec) mysql> select * from users; +---------+------------+-----------+ | user_id | company_id | canaccess | +---------+------------+-----------+ | 1 | 1 | 1 | | 2 | 1 | 0 | | 3 | 1 | 1 | | 4 | 2 | NULL | | 5 | 2 | 1 | | 6 | 2 | 0 | | 7 | 3 | 1 | | 8 | 3 | 0 | | 9 | 4 | 0 | +---------+------------+-----------+ 9 rows in set (0.00 sec) mysql> select company_id, sum(canaccess) from (select users.user_id, coalesce(users.canaccess,1) as canaccess, users.company_id, companies.name from companies join users on (users.company_id = companies.company_id) where companies.canaccess = 1 ) foo group by company_id; +------------+----------------+ | company_id | sum(canaccess) | +------------+----------------+ | 1 | 2 | | 2 | 2 | | 3 | 1 | | 4 | 0 | +------------+----------------+ 4 rows in set (0.00 sec) SELECT IFNULL(COUNT(User.Id), 0) AS UserCount, Company.* FROM Company LEFT JOIN User ON User.CompanyId = Company.Id AND User.CanAccessSystem = true WHERE Company.CanAccessSystem = true GROUP BY Company.Id
SELECT Company.ID, COUNT(*) AS UserCount
    FROM Company, User
    WHERE Company.ID = User.CompanyID
      AND User.CanAccessSystem = true
UNION
SELECT Company.ID, 0 AS UserCount
    FROM Company
    WHERE NOT EXISTS (SELECT * FROM User
                         WHERE Company.ID = User.CompanyID
                           AND User.CanAccessSystem = true)
SELECT UserCount, Company.*
    FROM Company JOIN
        (SELECT Company.ID AS ID, COUNT(*) AS UserCount
             FROM Company, User
             WHERE Company.ID = User.CompanyID
               AND User.CanAccessSystem = true
         UNION
         SELECT Company.ID AS ID, 0 AS UserCount
             FROM Company
             WHERE NOT EXISTS (SELECT * FROM User
                                  WHERE Company.ID = User.CompanyID
                                    AND User.CanAccessSystem = true)
        ) AS NumUsers
         ON Company.ID = NumUsers.ID
    WHERE Company.CanAccessSystem = true
SELECT c.CompanyID, c.CompanyName, SUM(CASE u.CanAccessSystem WHEN 1 then 1 else 0 end) 
FROM Company c LEFT OUTER JOIN
    [User] u
ON u.CompanyID = c.CompanyID
WHERE c.CanAccessSystem = 1
GROUP BY c.CompanyID, c.CompanyName