3

私は MySQL の第一人者ではありませんが、基本的なことはかなりうまくやっています。ご意見をいただきありがとうございます。

私は2つのテーブルuserfavorite. 各ユーザーは、複数の固有のお気に入りを持つことができます。

テーブル ユーザー u

[ user_id + name  ]
  100     | Sally

テーブル お気に入り お気に入り

[ fav_id  + user_id +  fav_key  +  fav_val ]
  1       | 100     | icecream  |    mint
  2       | 100     | candybar  |  snickers
  3       | 100     | color     |    red

値を列ヘッダーとしてSELECT使用して、ユーザーのお気に入りを列に変換するステートメントを作成したいと考えています。fav_key*問題は、これらはユーザーが入力した値であるため、値がどうなるかがわからないfav_valため、列名を動的に生成する必要があることです。

選択する ...

[ user_id + name  + fav_icecream + fav_candybar + fav_color ]
  100     | Sally |    mint      |   snickers   |   red 

SELECTパフォーマンスの遠い考えを念頭に置いて - 問題の 1 つは、ユーザー データとユーザーのお気に入りを取得するために2 つのステートメントを実行したくないことです(さらに、このように列に動的に名前を付けるというアイデアが好きです) .

アップデート

したがって、これはピボット、エクセレントと呼ばれます。

値がわからない場合はどうすればよいですか? お気に入りのクエリから列を動的に生成する必要があります。

4

2 に答える 2

4

このような:

Select fav.user_id, u.name 
       MAX(case WHEN fav.fav_key = 'icecream' then fav.fav_val end) as 'fav_icecream',
       MAX(case WHEN fav.fav_key = 'candybar'  then fav.fav_val end) as 'fav_candybar',
       MAX(case WHEN fav.fav_key = 'color'    then fav.fav_val end) as 'fav_color'
From favorite fav
     inner join users u on fav.user_id = u.user_id
group by fav.user_id

作業例:DEMO

注: デモはMS SQL Server用ですが、mysqlでも同じように機能します。ライブデモを提供しようとしました.

于 2012-02-14T15:31:26.027 に答える
3

基本的に、機能が必要ですPIVOT。残念ながら、これは MySQL でネイティブにサポートされていません (Oracle や SQL Server とは異なります)。MySQL の機能不足を回避する方法を示す StackOverflow に関する多くの質問があります。

https://stackoverflow.com/search?q=mysql+pivot+sql

いくつかの例:

于 2012-02-14T15:30:50.907 に答える