1

我正在 MySQL 中编写一个存储过程来获取一组管理信息。问题是:我需要“水平”而不是“垂直”的结果。为了详细说明,这是我要处理的数据库设计:

users

  • company_id
  • user_type_id

companies

  • company_id

user_types

  • user_type_id
  • 描述符

所以这是交易:我需要计算按描述符分组的所有用户,然后按公司分组。我可以这样:

SELECT
    COUNT(*) AS number,
    ut.descriptor,
    company_id
FROM
    users u

INNER JOIN
    user_types ut
ON ut.user_type_id = u.user_type_id
AND descriptor LIKE 'xyz%'

INNER JOIN
    companies c
ON u.company_id = c.company_id

GROUP BY
    ut.descriptor,
    company_id

然而,这确实给了我正确的结果:这个列表是“垂直的”。我为每个描述符得到一个新行。我实际上希望描述符成为列。行应按公司分组。这就是应用程序逻辑所期望的。

我想先获取描述符,然后再进行计算,但这给我留下了完全相同的问题。我可以为每个描述符执行一个子查询,但这会非常非常难看。

总而言之,预期的结果是这样的,后面的 3 列实际上是 user_types 表中的描述符:

company- admin- customer-supplier

1 - 4 - 1 - 5

1 - 7 - 4 - 2

这将转化为:公司 1 有 4 名管理员、1 名客户、5 名供应商。公司 2 有 7 名管理员、4 名客户、2 名供应商。

我真的觉得我在这里遗漏了一些东西。我忽略了什么?

4

1 回答 1

2

你可以这样做,但它不是表格的动态宽度。你可能想用类似的东西替换IF(ut.descriptor = 'admin'IF(u.user_type_id = 1 根本不需要加入 ut

SELECT
    company_id AS company,
    COUNT(IF(ut.descriptor = 'admin', 1, NULL) AS admin,
    COUNT(IF(ut.descriptor = 'customer', 1, NULL) AS customer,
    COUNT(IF(ut.descriptor = 'supplier', 1, NULL) AS supplier
FROM
    users u

INNER JOIN
    user_types ut
ON ut.user_type_id = u.user_type_id
AND descriptor LIKE 'xyz%'

INNER JOIN
    companies c
ON u.company_id = c.company_id

GROUP BY
    company_id
于 2012-06-28T09:44:23.573 回答