質問: MySQLのsql文で教えていただきたいのですが、 テーブル1のidとテーブル2のidが同じものを テーブル2のレコードごとに同じidにカラムを足していきたいのですが、 このような結果を出す事は可能でしょうか? またできれば1回のクエリで実行できればと思います。 初心者で申し訳ございませんが。 どうしても解決する事ができなかったため ご教授いただければと思います。 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/d4546f43bc2d836ac96b6e85511a72fd.jpeg) miyaha様 >> 丁寧にご教授頂きありがとうございます。 現在簡単なアクセス解析を作っておりまして ページの訪問者の情報をDBに書き込んでいました。 それを元にページをどのように遷移していったかを 簡単なアクセスフローをHTMLで作っておりまして。 セッションごとに観覧履歴をsqlでテーブルとして吐き出しその後、 javascriptで同じページのテーブルをソートし、縦に同じテーブルをつなぐ処理を行っていたのですが、 レコードが増えるにつれjavascriptではやはり重くタイムアウトしてしまうようになりまして。 このたびjavascriptの部分をsqlで代用できたらよいなと思い相談させていただきました。 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/431aff15ac7c39738292c910ed95625d.jpeg) 先ほどのものを書き換えると下記の様に観覧履歴をセッションごとに時系列に並べ 上下同じページ名がグルーピングされるように昇順に並び替える事が sqlできればよいなと思っておりまして。 すみませんがご教授お願いいたします。 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/bca1db4b942fb1999d81409f5ddfb53d.jpeg)
回答: 初心者にはちょっと厳しいかと思いますが、先日質問があがった 結合したテーブルの取得結果が複数件存在した場合に1件として扱えますか。の回答を利用すれば可能です 追記 === 前回提示したとおりSQLを以下組み立てればできそうですが・・・ * 元データ作成 必ず順位付けができるようにidを振ってあります。 時系列で処理するなら更新日時などを利用してもよいでしょう。 ただし同値で同順位になるようだと問題です ``` create table tbl(id int unique,sess int,val varchar(10)); insert into tbl values (1,1,'A'), (2,1,'B'), (3,2,'A'), (4,2,'C'), (5,2,'D'), (6,3,'A'), (7,3,'C'), (8,3,'E'), (9,3,'F'), (10,3,'G'), (11,4,'D'), (12,5,'C'), (13,5,'D'); ``` * 検索 ``` select sess ,group_concat(case rank when 1 then val end) as val1 ,group_concat(case rank when 2 then val end) as val2 ,group_concat(case rank when 3 then val end) as val3 ,group_concat(case rank when 4 then val end) as val4 ,group_concat(case rank when 5 then val end) as val5 from( select id,sess,val,(select count(*)+1 from tbl as t2 where t1.sess=t2.sess and t1.id>t2.id) as rank from tbl t1 ) as b group by sess ``` 上記をいちいちgroup_concatを書くのが面倒でしたら 参考につけたprocedureで処理します。