SELECT実行で 「500 Internal Server Error」

下記構成でm_sysテーブルのレコード数が多くなるにつれSELECT実行で 「500 Internal Server Error」が出るようになってしましました。対策ありましたらよろしくお願いいたします。

CREATE TABLE m_sys (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
mon_am1 smallint(1),
mon_am2 smallint(1),
中略
fri_am1 smallint(1),
fri_am2 smallint(1),
PRIMARY KEY (id)
);

INSERT INTO m_sys (mon_am1,mon_am2,tue_am1,tue_am2,wed_am1,wed_am2,thu_am1,thu_am2,fri_am1,fri_am2) VALUES('1','2','3','4','5','6','7','8','9','10');

CREATE TABLE m_schedule_a (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
schedule CHAR(6),
PRIMARY KEY (id)
);

INSERT INTO m_schedule_a (schedule) VALUES('1:00');
中略
INSERT INTO m_schedule_a (schedule) VALUES('10:00');


SELECT
msa1.schedule as mon_am1,
msa2.schedule as mon_am2,
中略
msa9.schedule as fri_am1,
msa10.schedule as fri_am2

from
m_sys m,
m_schedule_a msa1,
中略
m_schedule_a msa10

where
m.mon_am1 = msa1.id
AND
m.mon_am2 = msa2.id
AND
中略
AND
m.fri_am1 = msa9.id
AND
m.fri_am2 = msa10.id

回答の条件
  • URL必須
  • 1人2回まで
  • 13歳以上
  • 登録:2010/03/06 20:25:52
  • 終了:2010/03/08 09:33:44

ベストアンサー

id:GreenStar No.2

GreenStar回答回数192ベストアンサー獲得回数462010/03/06 21:11:48

ポイント53pt

総当りでぶつけてWHEREで絞り込む方法ではメモリも時間も大量に使ってしまう! 必要なものだけ搾り出すように変更する!!

例えば、スカラー副問い合わせを用いれば以下のような感じ!!

SELECT 
    (SELECT b.schedule FROM m_schedule_a b WHERE b.id = a.mon_am1 OFFSET 0 LIMIT 1) mon_am1,
    (SELECT b.schedule FROM m_schedule_a b WHERE b.id = a.mon_am2 OFFSET 0 LIMIT 1) mon_am2,
        中略
    (SELECT b.schedule FROM m_schedule_a b WHERE b.id = a.fri_am2 OFFSET 0 LIMIT 1) fri_am2
FROM m_sys a

http://dev.mysql.com/doc/refman/4.1/ja/scalar-subqueries.html

その他の回答(1件)

id:km1967 No.1

km1967回答回数541ベストアンサー獲得回数402010/03/06 21:04:45

ポイント17pt

まずはお願いなのですが、

お使いのOS、アプリケーションサーバ、RDBMSの名称とバージョンなど、

何も判らないと原因の特定は難しくなりますので、必須だとご記憶ください。

不適当な回答が集まっても混乱をきたしますから、私への返信欄か、

あるいは、コメント欄を開く設定に変更してコメント欄に、

書き加えておくことを勧めます。


一般論としては、AND式が長すぎるためのエラーと思われます。

その他、まったく正規化がなされていないので

テーブル設計から見直す必要があります。

http://www.mirai.ne.jp/~suehiro/am/kihonyougo/normal.htm

id:GreenStar No.2

GreenStar回答回数192ベストアンサー獲得回数462010/03/06 21:11:48ここでベストアンサー

ポイント53pt

総当りでぶつけてWHEREで絞り込む方法ではメモリも時間も大量に使ってしまう! 必要なものだけ搾り出すように変更する!!

例えば、スカラー副問い合わせを用いれば以下のような感じ!!

SELECT 
    (SELECT b.schedule FROM m_schedule_a b WHERE b.id = a.mon_am1 OFFSET 0 LIMIT 1) mon_am1,
    (SELECT b.schedule FROM m_schedule_a b WHERE b.id = a.mon_am2 OFFSET 0 LIMIT 1) mon_am2,
        中略
    (SELECT b.schedule FROM m_schedule_a b WHERE b.id = a.fri_am2 OFFSET 0 LIMIT 1) fri_am2
FROM m_sys a

http://dev.mysql.com/doc/refman/4.1/ja/scalar-subqueries.html

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません