質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

3回答

6071閲覧

MySQLで外部結合で横に繋げていく事はできますでしょうか?

takamilk2

総合スコア20

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2017/11/14 11:25

編集2017/11/14 12:25

MySQLのsql文で教えていただきたいのですが、

テーブル1のidとテーブル2のidが同じものを
テーブル2のレコードごとに同じidにカラムを足していきたいのですが、
このような結果を出す事は可能でしょうか?
またできれば1回のクエリで実行できればと思います。

初心者で申し訳ございませんが。
どうしても解決する事ができなかったため
ご教授いただければと思います。

イメージ説明

miyaha様 >>

丁寧にご教授頂きありがとうございます。
現在簡単なアクセス解析を作っておりまして
ページの訪問者の情報をDBに書き込んでいました。

それを元にページをどのように遷移していったかを
簡単なアクセスフローをHTMLで作っておりまして。

セッションごとに観覧履歴をsqlでテーブルとして吐き出しその後、
javascriptで同じページのテーブルをソートし、縦に同じテーブルをつなぐ処理を行っていたのですが、
レコードが増えるにつれjavascriptではやはり重くタイムアウトしてしまうようになりまして。
このたびjavascriptの部分をsqlで代用できたらよいなと思い相談させていただきました。

イメージ説明

先ほどのものを書き換えると下記の様に観覧履歴をセッションごとに時系列に並べ
上下同じページ名がグルーピングされるように昇順に並び替える事が
sqlできればよいなと思っておりまして。
すみませんがご教授お願いいたします。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyahan

2017/11/14 11:36

これは「外部結合」とは言いません。また一般的にリレーショナルデーターベースで行う操作でもありません。このようにレコードを加工して何をしたいのか(理由・いきさつ)を書くとよりよいアドバイスがもらえると思います。
guest

回答3

0

初心者にはちょっと厳しいかと思いますが、先日質問があがった
結合したテーブルの取得結果が複数件存在した場合に1件として扱えますか。の回答を利用すれば可能です

追記

前回提示したとおりSQLを以下組み立てればできそうですが・・・

  • 元データ作成

必ず順位付けができるようにidを振ってあります。
時系列で処理するなら更新日時などを利用してもよいでしょう。
ただし同値で同順位になるようだと問題です

SQL

1create table tbl(id int unique,sess int,val varchar(10)); 2insert into tbl values 3(1,1,'A'), 4(2,1,'B'), 5(3,2,'A'), 6(4,2,'C'), 7(5,2,'D'), 8(6,3,'A'), 9(7,3,'C'), 10(8,3,'E'), 11(9,3,'F'), 12(10,3,'G'), 13(11,4,'D'), 14(12,5,'C'), 15(13,5,'D');
  • 検索

SQL

1select sess 2,group_concat(case rank when 1 then val end) as val1 3,group_concat(case rank when 2 then val end) as val2 4,group_concat(case rank when 3 then val end) as val3 5,group_concat(case rank when 4 then val end) as val4 6,group_concat(case rank when 5 then val end) as val5 7from( 8select id,sess,val,(select count(*)+1 from tbl as t2 where t1.sess=t2.sess and t1.id>t2.id) as rank 9from tbl t1 10) as b 11group by sess

上記をいちいちgroup_concatを書くのが面倒でしたら
参考につけたprocedureで処理します。

投稿2017/11/14 11:45

編集2017/11/14 13:07
yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takamilk2

2017/11/14 12:44

Orlofsky様にもこちら回答頂いたのですが、追加で補足画像をついかしたのですが、カラムごとソートをかけたいので1つのカラムに複数の値がまとまってしまうと厳しく。。
takamilk2

2017/11/14 13:01

すみません。Orlofsky様と同じでこの頂いた内容で解決できそうです。 おいそがしい中本当にありがとうございました!
yambejp

2017/11/14 13:08

解決したのでしたら問題ありませんが、一応追記しておきましたので さらっと読んでおいて下さい
takamilk2

2017/11/15 07:55

丁寧にどうもありがとうございます。。 わざわざわかり易く私の書いた内容を当て込んで頂きありがとうございます。 こちらですごくわかり易くなりました。 また今回の場合group_concatが変動しますのでこちらを参考にprocedureで対応したいと思います。
guest

0

追記を見ました。階層構造はMySQLなどのリレーショナルデータベースが苦手とするジャンルです。

幸い、必ず1つの子しか持たない(分岐を伴わない)データ構造なので、yambejp さんが回答されているようにプログラム側で配列等に入れて集計していくのが最もシンプルで確実だと思います。

その結果を json で渡して JavaScript で描写するなり、PHP で結果のHTMLを生成するなりすればよいと思います。

投稿2017/11/14 12:44

編集2017/11/14 12:45
miyahan

総合スコア3095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takamilk2

2017/11/14 13:03

改装構造は苦手なのですね。色々とご教授ありがとうございました。 またsqlのあとの処理もご意見頂き誠にありがとうございました。 なんとかおかげ様で解決できそうです。本当にありがとうございました。
guest

0

ベストアンサー

GROUP_CONCAT を使う方法が参考になるでしょう。

投稿2017/11/14 11:33

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takamilk2

2017/11/14 12:40

そういった物があるのを知りませんでした。勉強になります。ただ私の場合、一つづつレコードに順番にソートをかけたいので1つのカラムにまとまってしまうと厳しいのです。
takamilk2

2017/11/14 12:59

すみません。。まだteratailを使い始めたばかりで正しい回答いただいてたのに勘違いしてました。 ありがとうございます!こちらでなんとか解決できそうです! 大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問