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

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

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

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

Q&A

解決済

2回答

2508閲覧

複数の inner join の表示結果が遅くてerrorになる件について

alkeran

総合スコア29

PHP

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

0グッド

0クリップ

投稿2016/08/27 12:53

表題の件ですが、4つのテーブルの"id","JANCode","No"同士を結合したいのですが、データ量が多いからか"Internal Server Error"と表示されます。ご教授宜しくお願い致します。

<?php // データベース情報 $sv = 'localhost'; // サーバー名 $db = 'db_name'; // データベース名 $uid = 'user'; // ユーザー名 $pwd = 'pass'; // パスワード // データベースに接続します try { $db = new PDO('mysql:host='.$sv.'; dbname='.$db, $uid, $pwd); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->exec('SET NAMES utf8'); } catch(PDOException $e) { die('Connection failed: '.$e->getMessage()); } // データを取得します $sth = $db->prepare('SELECT * FROM ((t1 INNER JOIN t2 ON t1.JANCode = t2.JANCode) INNER JOIN t3 ON t1.id = t3.id) INNER JOIN t4 ON t1.No = t4.No;'); $sth->execute(); ?>

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

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

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

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

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

guest

回答2

0

データ量が多いからか"Internal Server Error"と表示されます。

Internal Server Error なので、「データ量」うんぬんではなく、プログラムの文法的なエラーに近いものです。
ソースコードのなかのコメントに記述しているので、確認してみてください。

php

1<?php 2// エラーメッセージを表示する 3// 開発中これを書いていないのはもってのほか。本番環境では 4// ini_set('display_errors', 0); 5ini_set('display_errors', 1); 6error_reporting(E_ALL); 7 8// データベース情報 9$sv = 'localhost'; // サーバー名 10$db = 'db_name'; // データベース名 11$uid = 'user'; // ユーザー名 12$pwd = 'pass'; // パスワード 13// データベースに接続します 14try { 15 16 // $db が異なる性質のもので上書きするのは保守性の面から好ましくない。変数名は異なるものにするべき 17 // dsn にスペース入れない 18 // $db = new PDO('mysql:host=' . $sv . '; dbname=' . $db, $uid, $pwd); 19 $dbh = new PDO('mysql:host=' . $sv . ';dbname=' . $db . ';charset=utf8', $uid, $pwd); 20 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 21// $dbh->exec('SET NAMES utf8'); <- 文字コードはコンストラクタで 22 23// try - cache のあとでSQLを利用するなら、後のexecute も含めた方がいいでしょう 24//} catch (PDOException $e) { 25// die('Connection failed: ' . $e->getMessage()); 26//} 27// データを取得します 28 $sth = $db->prepare('SELECT * 29 FROM 30((t1 31 INNER JOIN t2 32 ON t1.JANCode = t2.JANCode) 33 INNER JOIN t3 34 ON t1.id = t3.id) 35 INNER JOIN t4 36 ON t1.No = t4.No;'); 37 $sth->execute(); 38} catch (PDOException $e) { 39 die('Connection failed: ' . $e->getMessage()); 40}

投稿2016/08/27 13:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

alkeran

2016/08/27 13:25

$sth = $db->prepare('SELECT * の部分は $sth = $dbh->prepare('SELECT * でよろしいでしょうか? それでもエラー表示されます。
退会済みユーザー

退会済みユーザー

2016/08/27 13:28 編集

そうですね。 > それでもエラー表示されます。 エラーを直接なおすためのコードではありません。デバッグに必要な情報を出すためのコードですから。
alkeran

2016/08/27 13:30

ありがとうございました。
退会済みユーザー

退会済みユーザー

2016/08/27 13:54 編集

勘違いのため削除
guest

0

ベストアンサー

SQLの文法エラーかな。

SQLの書き方がACCESSっぽいですが、
MySQLではエラーになりますよ。

どこが原因かどうかは、
select * from t1
の状態から、1つずつ今の形に確認していけば、見つかるはずです。

投稿2016/08/28 19:28

tomari_perform

総合スコア760

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

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

alkeran

2016/08/29 04:58

ありがとうございます。 いろいろ試しましたが解決できませんでした。
tomari_perform

2016/08/29 09:00

もう少し試したことを書いてくれれば、 次のステップを明確に答えられるのですが。。 あくまで、私の回答は原因を見つける方法であり、 解決する方法ではなかったはず。 エラーの出る原因は分かりましたか? 原因が分からない場合、エラーメッセージは常に同じでしたか? FROMの後に「(」がある場合、すぐにテーブル名を記載すると、 MySQLではエラーのはずです。(ACCESSではOKですが)
alkeran

2016/08/29 11:31

「(」を消しましたし、「RIGHT JOIN」にしましたがデータ量が多いのか、やはり「Internal Server Error」の表示が出ました。原因はわかりません。
tomari_perform

2016/08/29 12:47

「(」を消した後のSQLを見せてください。 恐らくSQLとして正しくないはずなので。 ちなみに、「Internal Server Error」がどんなエラーか、理解していますか? データ量が多いからではないです。 データ量が多い判断した理由として、エラーが出るまでに、時間がかかっているのですか? データ量が多いとのことですが、10億レコードくらいあるのでしょうか? 「select * from t1 」または「select * from t1 limit 10」にプログラムを変更して実行しても同じエラーがでていたのですか?
alkeran

2016/08/29 13:28

多いと判断した理由としては、「ON t1.No = t4.No;');」の最後に「LIMIT 20」と付け加えたら正常に動作したためです。
alkeran

2016/08/29 13:29

コードは以下の通りです。 $sth = $db->prepare('SELECT * FROM t1 INNER JOIN t2 ON t1.JANCode = t2.JANCode INNER JOIN t3 ON t1.id = t3.id INNER JOIN t4 ON t1.No = t4.No;'); $sth->execute();
tomari_perform

2016/08/29 13:33

T1レコードに対して、条件文はないのですか? T1~T4テーブルにはそれぞれ何レコードくらいありますか? あと、T1~T4のテーブル仕様を教えてください。
alkeran

2016/08/29 13:40

T1は5万レコードくらいで、T2~T4にはそれぞれ1000レコード未満です。 T1~T4にはそれぞれ10~15フィールドほどあります。
tomari_perform

2016/08/29 13:48 編集

フィールド数ではなく、CREATE TABLE文を教えて欲しかった。 T1とT2,T3,T4のテーブルは1:nではなく、1:1なんですかね。 となると、最大5万レコードを抽出して表示するプログラムのようですが、 そんなに必要なのでしょうか? Limit 20にするか、条件指定して絞り込む対応が良いかと思いますが。 また、5万レコードの表示には少々時間がかかるはずなのと、 T2,T3,T4テーブルに適切なINDEXが貼られていないと、 最大50兆レコード(5万×1000×1000×1000)の検索になり、 永遠に終わらないでしょうね。。 ALTER TABLE T2 ADD INDEX IX_T2_JANCODE(JANCode); ALTER TABLE T3 ADD INDEX IX_T3_ID(id); ALTER TABLE T4 ADD INDEX IX_T4_NO(No);
alkeran

2016/08/29 13:53

実際に表示させたいのは t2 の商品名フィールドの1000レコード程度です。そのため、時間はそれほどかからないと思ったのですが。。
tomari_perform

2016/08/29 14:00

まぁ、1000レコードの抽出は一瞬ですね。 最初の質問の趣旨と異なってきていると思うので、 以下の情報を明記の上、別QAに出されてはいかがでしょうか。 ・T1~T4のCREATE TABLE文 ・T1~T4のデータサンプル ・表示させたい内容(どのテーブルのどのフィールドか) ・現状のSQL文、PHPプログラム これだけあれば、すぐ回答もらえると思いますよ。
alkeran

2016/08/29 14:01

いろいろ教えて頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問