1

この質問に対する答えをかなり探しましたが、これを行う方法を正確にはまだ見つけていません。

データベース内の関連する 3 つのテーブルは、ツール、目的、および user_tools です。ツールと目的の両方に id 列と説明列があり、user_tools には列 user_id、tool_id、および Purpose_id があります。ツールと目的は基本的に静的ルックアップ テーブルであり、user_tools には、特定のユーザーがツールを使用したすべての目的の行があります。

SELECT ステートメントを作成する必要があります。この列には、ツールの説明と、目的の表に記載されているさまざまな目的ごとの使用回数が含まれています。例えば。結果行:

description | Purpose: Class | Purpose: Student Club | Purpose: Personal Project | ...

'Lathe'     |  100           |   50                  |     11                    | ... 

目的テーブルに新しいエントリを追加したい場合にコードを変更する必要がないように、purpose_id を SELECT にハード コードすることなくこれを実行したいと考えています。

次のステートメントは、必要な情報を取得しますが、目的のカウントごとに新しい行を作成し、それらをすべて列に入れたいと考えています。

SELECT 
  tool.description, 
  count(purpose.id), 
  purpose.description 
FROM 
  user_tools LEFT OUTER JOIN tool 
ON 
  user_tools.tool_id = tool.id LEFT OUTER JOIN purpose 
ON 
  user_tools.purpose_id = purpose.id 
GROUP BY 
  tool.description, 
  purpose.description
4

1 に答える 1

0

動的 SQL を使用するプロシージャを作成する以外に、目的の ID をハードコーディングする必要があります。これは、クエリでさまざまな数の結果列を使用できないためです。

必要なのは PIVOT 操作です。MySQL での実行方法は次のとおりです。

SELECT
  tool.description,
  COUNT(CASE WHEN purpose.id = <ID for Class> THEN 1 END) AS `Purpose: Class`,
  COUNT(CASE WHEN purpose.id = <ID for Student Club> THEN 1 END) AS `Purpose: Student Club`,
  . . . and the rest of the purpose.id values
FROM user_tools
LEFT JOIN tool ON user_tools.tool_id = tool.id
LEFT JOIN purpose ON user_tools.purpose_id = purpose_id
GROUP BY tool.description

この回答は、データに関する知識ではなく、サンプル クエリに基づいていることに注意してください。回答で必要な結果が得られない場合は、サンプル データを投稿してください。希望する結果が得られるようにクエリを修正できるはずです。

于 2013-08-14T15:44:02.557 に答える