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' 。utIF(u.user_type_id = 1 に参加する必要はまったくありません

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 に答える