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

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

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

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

1526閲覧

アプリ上の商品並び順が変わってしまう

pond

総合スコア350

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2020/06/08 12:00

編集2020/06/08 20:54

前提・実現したいこと

GMO MakeShopを使ったアプリを運営しているのですが、商品APIから取得した商品更新日(update_date)
を元に降順に商品を表示しています。アプリの仕組みは以下のようになっています。

① 商品APIから情報取得
② DBサーバに情報格納
③ JSONファイルに出力(json_encode()使用)
④ アプリで表示

利用者の方から、「商品の入庫・出庫があったタイミングで、アプリ上の「コンテンツA(MakeShopから取得しているコンテンツ)」
の商品並び順が変わってしまう」とのことでSQL文を調査していますが、商品APIの項目に入庫日・出庫日の項目はなく、取得も
していないので、なんで並び順が変わってしまうのか調査に行き詰まっている状況です。

入庫・出庫があったタイミングでデータベース更新日updated_atが更新されて、かつjson_encode()でJSONファイルを出力してるから
JSONファイル中の商品の並び順がアプリと違う順番へ変わるのが影響しているのか?と思いましたが、
JSONファイル出力前にSQL文中の主問い合わせORDER BY句、副問い合わせORDER BY句でupdate_date(商品更新日)を指定してるので
こちらの線は薄いと思っています。

このような事象をご経験された、もしくはこのような時に確認する項目があれば、ご教示頂きたくお願いします。

該当のソースコード

sql

1# 処理概要の図のContents.phpの一部 2# JSON出力する項目 3$cols = "id,area,category,target,title,body,posted_at,link,url_image,url_video,collections"; 4 5 6$sql = "SELECT {$cols}, update_date, odr, odr2 FROM"; 7 $sql.= "("; 8 # コンテンツA 9 $sql.= "SELECT {$cols}, update_date, 1 AS odr, CASE collections WHEN 99 THEN -1 ELSE 1 END AS odr2"; 10 $sql.= " FROM contents WHERE target=1 AND category={$category} ORDER BY update_date DESC LIMIT 5"; 11 $sql.= ") AS t1"; 12 $sql.= " UNION ALL "; 13 14 # コンテンツB 15 $sql.= "SELECT {$cols}, posted_at, 1, 1 FROM"; 16 $sql.= "("; 17 $sql.= "SELECT {$cols}"; 18 $sql.= " FROM contents WHERE target=2 AND category={$category} ORDER BY posted_at DESC LIMIT 5"; 19 $sql.= ") AS t3"; 20 $sql.= " UNION ALL "; 21 22       # コンテンツC(target:11) 23 $sql.= "SELECT {$cols}, null, 13, 101 FROM"; 24 $sql.= "("; 25 $sql.= "SELECT {$cols}"; 26 $sql.= " FROM contents WHERE target=11 AND category={$category} ORDER BY posted_at DESC LIMIT 1"; 27 $sql.= ") AS t5"; 28 $sql.= " UNION ALL "; 29 30 # コンテンツD(target:12) 31 $sql.= "SELECT {$cols}, null, 12, 101 FROM"; 32 $sql.= "("; 33 $sql.= "SELECT {$cols}"; 34 $sql.= " FROM contents WHERE target=12 AND category={$category} ORDER BY posted_at DESC LIMIT 1"; 35 $sql.= ") AS t7"; 36 $sql.= " UNION ALL "; 37 38 # コンテンツE(target:13) 39 $sql.= "SELECT {$cols}, null, 11, 101 FROM"; 40 $sql.= "("; 41 $sql.= "SELECT {$cols}"; 42 $sql.= " FROM contents WHERE target=13 AND category={$category} ORDER BY posted_at DESC LIMIT 1"; 43 $sql.= ") AS t9"; 44 $sql.= " UNION ALL "; 45 46 # コンテンツF(target:14) 47 $sql.= "SELECT {$cols}, null, 14, 101 FROM"; 48 $sql.= "("; 49 $sql.= "SELECT {$cols}"; 50 $sql.= " FROM contents WHERE target=14 AND category={$category} ORDER BY posted_at DESC LIMIT 1"; 51 $sql.= ") AS t11"; 52 53 $sql.= " ORDER BY odr, odr2, update_date DESC;"; 54

php

1# 処理概要の図のExportJsonCommand.php 2<?php 3 4namespace App\Console\Commands; 5 6use Illuminate\Console\Command; 7use Illuminate\Http\Request; 8use App\Models\Contents; 9use Carbon\Carbon; 10use DB; 11 12use App\Http\Controllers\HomeController; 13 14use Monolog\Logger; 15use Monolog\Formatter\LineFormatter; 16use Monolog\Handler\StreamHandler; // one file logging 17use Monolog\Handler\RotatingFileHandler; //dairy file rotating logging 18 19/** 20 * JSON出力処理 21 * 22 */ 23class ExportJsonCommand extends Command 24{ 25 protected $description = 'DBからJSONデータを出力します'; 26 27 protected $signature = 'command:export_json'; 28 protected $logger; 29 protected $formatter; 30 31 /** 32 * Create a new command instance. 33 * 34 * @return void 35 */ 36 public function __construct() 37 { 38 parent::__construct(); 39 40 $logFile = 'logs/batch.log'; 41 42 $this->logger = new Logger($this->signature); 43 $formatter = new LineFormatter(null, null, false, true); 44 $infoHandler = new StreamHandler(storage_path() ."/". $logFile, Logger::DEBUG); 45 $infoHandler->setFormatter($formatter); 46 $this->logger->pushHandler($infoHandler); 47 } 48 49 /** 50 * Execute the console command. 51 * 52 * @return mixed 53 */ 54 public function handle(Request $request) 55 { 56 $dt = new Carbon; 57 58 # ログ出力用文字列 59 $log_body = "".$dt->format('H:i:s')."~ "; 60 61 $home = new HomeController; 62 $res = $home->outputJSON(); 63 $log_body.= "***END:".$dt->format('H:i:s'); 64 65 # バッチ処理終了ログ出力 66 $this->logger->info($log_body); 67 } 68 69 70}

アプリの処理概要

イメージ説明

テーブル構造

イメージ説明

補足情報(FW/ツールのバージョンなど)

AWS使用(WEB:EC2、DB:RDS Aurola)
OS:CentOS Linux release 7.7.1908
言語:PHP 7.3.15 (cli)
フレームワーク:Laravel 5.7.22

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

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

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

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

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

YT0014

2020/06/08 12:34

先入観抜きで考えると、update_dateが更新されている可能性が一番高いと思います。 入出庫のタイミングで、在庫数の増減があると思うのですが、その影響でupdate_dateが更新されることはないのでしょうか? 仕様の詳細を確認するか、入出庫前後の該当商品のupdate_dateの値を確認することをお勧めします。
pond

2020/06/08 20:23

ご回答ありがとうございます。確認いたします。
pond

2020/06/08 20:46

足りない情報もありましたので、処理概要図・テーブル定義を追加いたしました。
YT0014

2020/06/08 22:51

ご提示いただいた情報では、update_dateは、「他のテーブルか何かの更新日時を取得している」ということしかわかりません。 元の更新日時の仕様を調べてみることをお勧めします。 また、GMO MakeShopのAPIに関しては、公開されている情報を確認できていません。情報の開示に、契約上の問題がないこともご確認ください。
pond

2020/06/09 01:24

API公開はGMOメイクショップさんと提供してる企業に限られるのでネット上へ公開はできないです。アドバイス頂いてるのにすみません。
YT0014

2020/06/09 04:29

update_dateは、APIからの取得だと思いますが、その場合、どういう契機でどのように更新されるのか、API提供元に問合せできるのではないでしょうか? tanatさんの回答にあるように、情報の確認と原因の特定が必要でしょうが、検討されるべき方法の1つだと思われます。
guest

回答1

0

ベストアンサー

質問を読む限り、SQLやDB以外の箇所に問題点がある可能性についてについて潰し切れていない様に見えるので、アプリに近い側から順に確認していくことをお勧めします。

  1. json_encode()の結果をログに吐き出してみて、想定している並びになっているかを確認する
  2. 1で想定している並びになっているのであれば、アプリ側のjsonのパースか表示の問題なのでアプリ側を直す
  3. 1で想定している並びになっていないのであれば、json_encode()する前の配列の状態でログに吐き出して並び順を確認する
  4. 3で並び順が想定通りなのであれば、json_encode()のオプションを見直すか、配列の形式を見直して想定通りの並びになるようにする
  5. 3で並び順が想定通りになっていないのであれば、SQLかデータがおかしい。
  6. 理想的なデータを用意して確認→3で想定した並び順になったらデータがおかしいので、データを更新/投入している部分を調査
  7. 理想的なデータでも駄目だった→SQLが問題なので、理想的なデータと理想的なSQLを直接DBで実行してみて、結果が想定通りであるか確認する
  8. 7の結果結果が想定通り→PHPで生成されているSQLがおかしいので、実際に生成/実行されているSQLをログに吐いて生成でミスって無いか確認
  9. 7の結果が想定外→SQLがミスっていることが確定するので、SQLを見直す

という流れで一つづつ潰して、結果を質問に追記してみてください。

現状提示されているコードは途中が省略されているように見えますし(全角スペースが混ざっててパースエラーになったりしますし、分岐も削っている?動いているコードそのままでは無いですよね)、テーブル構造や処理詳細が示されていないので回答者が何かを再現しようとしても情報が足りませんので、適切な回答を得るには情報の追記が必須だと思います。

投稿2020/06/08 17:23

編集2020/06/08 17:36
tanat

総合スコア18727

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

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

pond

2020/06/08 20:24

ご回答ありがとうございます。確認してみます。
pond

2020/06/08 20:40

>テーブル構造や処理詳細が示されていないので回答者が何かを再現しようとしても情報が足りませんので、>適切な回答を得るには情報の追記が必須だと思います。 おっしゃる通りです。テーブル構造・アプリの処理概要を追加いたしました。
tanat

2020/06/13 08:55

追記ありがとうございます。 回答で提示したそれぞれの箇所での確認についても追記お願いします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問