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

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

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

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

2回答

3422閲覧

前回の順位を含む、毎週のランキングをlaravelを使って実装したい

tech_first

総合スコア13

MySQL

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2020/06/09 00:56

毎週ごとのランキングデータを取得し、ランキングを実装したい

いつもお世話になっております。

毎週自動でデータをsplに登録し、それをランキング形式で表示したいと思っています。

1,ランキングを取得し、表示
2,先週分のそのデータの順位を4週間分
3,最新は一番左に表示
4,圏外からランクインした際は圏外と表示

こちらを図のように表示したいと考えております。


商品名 2020-01-22   2020-01-15   2020-01-08   2020-01-01


データ1  1位        3位       5位       3位
データ2  2位        1位       2位       4位
データ3  3位        3位       圏外       1位
データ4  4位        2位       3位       3位
データ5  5位        6位       4位       2位
データ6  6位        8位       5位       1位
....

簡単な図で申し訳ありませんが、このように実装したいと考えております。

どのようにデータベースを設計すれば良いのでしょうか。

現状のデータベースは

商品名カラム name
順位カラム rank
取得日カラム date

となっております。

最新のランキングだけならなんとか出力できたのですが、前回の順位をデータに持たせる方法がわかりません。

sql文で

SELECT rank WHERE name="データ1" AND date="取得日"

のようにすればその商品の取得日に対応するデータが取れると思うのですが
データが多いのでどのように変数に代入すれば良いか分かりません。

データベースの設計と、
前回の順位を含むランキング作成に置けるヒントがあれば
ぜひ頂けますと幸いです。

何卒、よろしくお願い致します。

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

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

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

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

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

m.ts10806

2020/06/09 01:06

設計を確認したいようですが、手段に終始されているので、進まないと思います。 「どんなデータが必要か」から考えてみては。
tech_first

2020/06/09 01:13

ありがとうございます。 データに関しては順位と商品名と日付で実装できるのかと思ったのですが、 pre-rankのように前回の順位を保存するカラムが必要なのでしょうか。 ご返信いただきまして誠にありがとうございます。
guest

回答2

0

ベストアンサー

こちらを図のように表示したいと考えております。

そのようなテーブルを作って商品データと繋げれば良いんじゃないでしょうか?
列名は日付だと汎用性無いのでlatest 7daysago 14daysagoにでもして。
これが期待するものなのかも分からないので本当に出力したい形でテーブルを作ってそれを徐々に汎用性のある形に直すなり分解するなりして考えた方が良いと思います

投稿2020/06/09 01:19

編集2020/06/09 01:20
hentaiman

総合スコア6426

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

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

tech_first

2020/06/09 01:23

ご回答いただきましてありがとうございます。 テーブルを2つ作成して、商品idでlatestなどからデータを参照する方法ということでしょうか。
hentaiman

2020/06/09 01:28

そうですね というか個人的にランキングなら上位20位とか100位とか一定数分かれば良いだけだと思うのでそういう持ち方すらしようとしませんね、データ量的に賢くない 「アイテムAが何位」じゃなくて「1位はアイテムA」みたいな考え方です なので、本当に出力したい形式を考えてそこから遡って行くのがいいでしょうね
tech_first

2020/06/09 01:46

1位はアイテムAというのは商品ではなく順位のIDで取得するアイテムを参照する方法ですね。 ありがとうございます! 出力したい形式はあるので、そこから遡って着手してみます。
hentaiman

2020/06/09 02:15 編集

うん もし自分がランキング作れって言われたとしたら色々と考慮した設計が頭に浮かぶけど、実際のところはリアルなデータ量や情報と運用フローも合わせた状態で無いと何がベストか分かりません。 普通ならこういう設計だろうという設計が運用上都合の良い設計とは限らないので、開発者の観点だけでなく運用者の観点も想像(または直接ヒアリング)した上で設計に入るのが正解です 技術的に最も正しい事が利用者にとって不便では話にならない それでも問題が起きたら改修だ!
tech_first

2020/06/09 02:54

ありがとうございます。 とにかくテーブル設計から再度練り直します。 ありがとうございました!
tech_first

2020/06/09 03:03

こちらベストアンサーにさせていただきました。 7daysagoなどを利用する際に最新のデータがlatastカラムに入って 1つずつスライドさせなくてはならないと思うのですが、 それはsql文でなんとかなるのでしょうか。 お忙しい中恐れ入りますがよろしくお願い致します。
hentaiman

2020/06/09 03:23

update fromで出来ますよ
hentaiman

2020/06/09 03:30 編集

SQLのみで処理したい理由が速度を気にしての事なら、例に挙げた設計なら気にする必要ないと思いますよ、上位〇〇位を保存する形式ならデータ量も知れたもんなのでプログラム介する方が理解し易いならプログラム介してもいいと思います。 データ量と自分や開発仲間の技術力に見合った方法を選びましょう
tech_first

2020/06/09 06:10

ありがとうございます。 返事が遅れてしまい申し訳ありません。 結局、sql文にてphpの配列に id name latest 7daysago 14daysago 21daysago このキーを持った配列をsqlを4回発行して作成して実装してみることにしました。 レベルが低くやりたいことができないのが悔しいですが、頑張ります。 ご丁寧にお答えいただきましてありがとうございます。
guest

0

一定の集計期間が過ぎた場合、その後ランキングは変化しないわけですから
前回や前々回などのデータを毎回検索するのは無駄です。
ウィークリーにメンテナンス処理を入れて、ランキング計算をして
専用のテーブルに保持するのが賢明です

もちろんどうしてもということなら毎回やることも可能です
その場合集計期間ごとの集計処理をサブクエリにして、
今週のランキングにleft joinしてやるだけです

投稿2020/06/09 02:04

yambejp

総合スコア115010

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

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

tech_first

2020/06/09 03:09 編集

回答いただきましてありがとうござまいた。 メンテナンス処理とは、laravelでいうcronのことでしょうか? 調べてみたのですがこれといった情報がなくて、申し訳ありません。 つまり4週分必要ということは最新と3つのサブクエリが必要といった認識でしょうか。 質問ばかりになってしまい大変申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問