人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MYSQL5.1で以下のようなストアドプロシージャを作成したとします。

delimiter //
CREATE PROCEDURE TEST()
BEGIN
SELECT HTL.TEST1, HTL.TEST2 FROM
(
SELECT TEST1, TEST2
FROM TESTA
WHERE ID = 4
UNION ALL
SELECT TEST3, TEST4
FROM TESTB
WHERE ID = 5
)
AS AA ;
END
//
呼び出し
CALL TEST()//

で、こうすると全件ヒットしたのが出てきてしまうので
呼び出すときに、
CALL TEST(1,10,@cnt)//
みたいな方法で呼び出して、
ストアドプロシージャ内で、LIMITを付与し、取得するデータを制限したいのと
さらに、全件の件数だけ取得したいです。

わかる方、いましたら、ご協力お願いします。

●質問者: hopefully
●カテゴリ:就職・転職 ウェブ制作
✍キーワード:AA ALL as BEGIN CNT
○ 状態 :終了
└ 回答数 : 4/5件

▽最新の回答へ

1 ● ko8820
●23ポイント

http://doruby.kbmj.com/toma_on_rails/20090327/_MySQL

http://idocsq.net/page/16

http://tt-house.com/2008/11/procedure-on-mysql.html

このあたりが参考になります。


2 ● aside
●23ポイント
delimiter //
CREATE PROCEDURE TEST(IN startIdx INT, IN endIdx INT, OUT cnt INT)
BEGIN
SELECT COUNT(*) INTO cnt FROM
(
SELECT TEST1, TEST2
FROM TESTA
WHERE ID = 4
UNION ALL
SELECT TEST3, TEST4
FROM TESTB
WHERE ID = 5
);
SELECT HTL.TEST1, HTL.TEST2 FROM
(
SELECT TEST1, TEST2
FROM TESTA
WHERE ID = 4
UNION ALL
SELECT TEST3, TEST4
FROM TESTB
WHERE ID = 5
LIMIT startIdx-1, endIdx
)
AS AA ;
END
◎質問者からの返答

ERROR 1221 (HY000): Incorrect usage of UNION and INTO

という風になってしまいます・・

なんでだろう・・


3 ● Km1967
●22ポイント

http://dev.mysql.com/doc/refman/5.1/ja/call.html

動かしてはおらんが、何もないよりましだろう。

delimiter //
CREATE PROCEDURE TEST(st INT, ed INT, INOUT c INT)
BEGIN
 SELECT count(*) INTO c FROM (
 SELECT TEST1, TEST2 FROM TESTA WHERE ID = 4
 UNION ALL
 SELECT TEST3, TEST4 FROM TESTB WHERE ID = 5
 ) AS AA;
 SELECT TEST1, TEST2 FROM (
 SELECT TEST1, TEST2 FROM TESTA WHERE ID = 4
 UNION ALL
 SELECT TEST3, TEST4 FROM TESTB WHERE ID = 5
 ) AS AA
 LIMIT st, ed;
END
//
delimiter ;
SET @cnt = 0;
CALL TEST(1, 10, @cnt);
SELECT @cnt;

話は変わるが、これはphpとの組み合わせで使うことになるのであろう? VIEWのほうが良いかもしれぬぞ。

mysql_num_rowsで総数を数え、LIMITを組み込んだSQLを発行という流れなど、よければ、少し考えてみるよろし。

◎質問者からの返答

ありがとうございます。

少し、質問なんですが

なぜ、PHPで使用する場合、VIEWの方がいいのでしょうか?

もし、よろしければ教えていただけませんか?


4 ● Km1967
●22ポイント

MySQLのストアドはCREATE時には簡単な構文チェックのみで実行コードへの変換等は行われない。すなわち、呼び出す度に変換が行われ、そのあと実行という2段階になる。もっと重要な問題がクエリーキャッシュが効かない事。(下記参照)ストアドの利用は高速化という意味での恩恵はあまりないどころか下手に使うと負荷増大&低速化という可能性が高まる。

http://dev.mysql.com/doc/refman/5.1-olh/ja/query-cache-operation...

次のようなクエリーにはキャッシュは使用されません。

*クエリーが外部クエリーのサブクエリーである場合

*ストアドファンクション、トリガー、イベントなどのボディ内で実行したクエリー

ストアドを共通ルーチンと位置付けて管理していくというのであれば、そちらのほうが高速化よりも重要かもしれぬが、当然ながらphpファイルの一覧とは別にストアドの一覧のようなものを作成して、管理運営していかねばならぬという管理コストも発生する。


対してVIEWはテーブルに近い感覚で動作し、扱う事ができる分、ストアドよりは比較的、お気軽お手軽。

しかし、INDEXを使えないなど欠点は多い(下記参照)し、サブクエリ内でUNIONを使っておるからこちらもクエリキャッシュは効かんはずじゃ、よりパフォーマンスを求めるとなるとテーブル構成やアプリ側の対処までの広範囲で設計見直したほうが良いじゃろう。

http://dev.mysql.com/doc/refman/5.1/ja/view-restrictions.html


以上簡単じゃが、データベース設計段階で考えるべきお話じゃから、このあたりまでにする。がんばりなされ。

◎質問者からの返答

なるほど、MYSQLのストアドはあまり扱いずらいのですね・・

ですが、今回のメインはストアドを共通ルーチンとして管理というのが

主なので、今回はいいと思います。

とりあえず、上記クエリを実行したのですが・・

試したのですが・・

MySQL server version for the right syntax to use near 'st, ed;

となってしまいますね。。

なんででしょうかね・・

自己解決しました。すいません、色々と。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ