2

私はdepartmentテーブルとuserテーブルを持っていますが、各アソシエイトが異なる部門に所属していることは明らかです。
各部門のすべてのユーザーを個別に取得したい。group by または ... でそれを行うことはできますか?

私の試みは次のとおりであり、望ましい結果が得られません。

select username,b.deptName
  from user a 
 inner join dept b 
    on a.dept=deptId group by deptName

PS: 部門ごとに個別のクエリではなく、さまざまな部門の従業員を取得するために 1 つの SQL クエリが必要です!


サンプルデータ

User(Table)

username  dept

John       1
Jack       2    
Sam        1
Tedy       1
Tom        2
Sara       2

dept:(Table)
deptId deptName
1      HR
2      IT

My Desired result:
HR:John-Sam-Tedy
IT:Jack-Tom-Sara
4

2 に答える 2

5

1 つのクエリは、個別の結果セットではなく、1 つの結果セットを返します。

クエリの GROUP BY は、多くの行を削除します。

部門ごとに 1 つの行が必要な場合は、GROUP_CONCAT 関数を使用できますが、いくつかの制限があります。(最大長は によって制限されてmax_allowed_packetおり、どのユーザー名にも文字として表示されない区切り文字を使用する必要があります。

SELECT b.deptName
     , GROUP_CONCAT(a.username ORDER BY a.username ASC SEPARATOR '-') AS usernames
  FROM user a
  JOIN dept b
    ON a.dept=b.deptId
 GROUP BY b.deptName

GROUP_CONCAT にある種の ORDER BY を含めて、結果が決定論的になり、実行ごとに変化しないようにすることをお勧めします。

より望ましい出力は、おそらく各ユーザー名の個別の行です。ORDER BY 句を使用して、隣り合った部門の行を取得できます。それらは実際には「別々」ではありませんが、行は順序付けられます。

SELECT b.deptName
     , a.username
  FROM user a
  JOIN dept b
    ON a.dept=b.deptId
 ORDER BY b.deptName, a.username

Q: "max_allowed_pa​​cket" は、文字数または実際のサイズ (1MB など) に基づく制限であると説明してください。

A:

関数によって返される文字列のGROUP_CONCAT()長さには制限があります。制限は(文字ではなく)バイト単位で指定され、max_allowed_packetセッション変数の現在の値から導出されると思います。

例えば:

SHOW VARIABLES LIKE 'max_allowed_packet';

Variable_name       Value    
------------------  ---------
max_allowed_packet  1048576

したがって、これは GROUP_CONCAT によって返される文字列が 1MB を超える可能性があることを意味します。

于 2013-07-17T04:41:54.470 に答える