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

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

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

COUNT は、広く使用されているSQLの関数です。COUNT関数は、行数、もしくは配列のエンティティの数をカウントします。

MySQL

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

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

3回答

2540閲覧

mysqlとcountの使い方

marusu

総合スコア16

COUNT

COUNT は、広く使用されているSQLの関数です。COUNT関数は、行数、もしくは配列のエンティティの数をカウントします。

MySQL

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

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

0クリップ

投稿2016/08/30 03:51

編集2016/08/30 06:12

mysqlから5件取得したらその5件の下から、5件を取得させるようにループさせたいんですがどうしたらいいのでしょうか?5件は取得させることはできますがそのまた下の5件がなかなかうまくいきません。
foreach文とcount関数など使ってますが苦労してます。ご教授よろしくお願いします。

1234
4568
4532
1254
1236←最初にここまでを表示
1452←次はここから表示
1235
7895
1125
1478

追記です。
説明不足ですみません。
実現したいことはamazon APIにasinコードでリクエストし情報が返ってくるようにしたいんですが、asinコードのリクエストが最大10件なのでとりあえず5件ずつリクエストし情報を取得させたい感じです。
なのでデーターベースから5件ずつを最後までループするような感じに取得できないかと考えていました。

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

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

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

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

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

guest

回答3

0

  • 最初の5件は「LIMIT 0,5」
  • 次の5件は「LIMIT 5,5」

かならずORDER BY 句で表示順を確定してください

投稿2016/08/30 03:54

yambejp

総合スコア114839

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

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

marusu

2016/08/30 06:05

回答ありがとうございます。 上記のコメントと同じで100件以上あった場合の同じ処理を繰り返すことは不可能でしょうか?
marusu

2016/08/30 06:11

説明不足ですみません。 実現したいことはamazon APIにasinコードでリクエストし情報が返ってくるようにしたいんですが、asinコードのリクエストが最大10件なのでとりあえず5件ずつリクエストし情報を取得させたい感じです。 なのでデーターベースから5件ずつを最後までループするような感じに取得できないかと考えていました。
yambejp

2016/08/30 06:23

amazon APIになげるのはasinを5件なのですよね? asinは100個程度最初からもっているのでしょうか? であれば配列に入れておいて $list=[・・・]; for($i=0;$i<=count($list);$i+=5){ うんたらかんたら } で5つデータを抜き出して、APIに投げるとかでしょうか? API側の仕様にあわせて調整してください
marusu

2016/08/30 07:21

度々ありがとうございます。 100件ほど入っていまして、毎回のように手打ちでasinコードを入力し情報を取得するのは効率が悪いと思い、asinコードをDBに保存し、DBから5件ほど出しさらに5件をamazonAPIに投げれないのかなと考えています。5件と私は言ってますが仕様10件までらしいです。 例として5件投げて情報を取得し、次の5件を投げて情報を取得するのをDB内にある限り最後まで自動的に繰り返すような感じです。 よろしくお願いします。
yambejp

2016/08/30 07:25

APIへのデータの投げ方はどのようにやると想定していますか?
marusu

2016/08/30 07:33

while ($data = mysql_fetch_array($result)) {}を使いasinを連想配列で表示させ、そこから5件ずつAPIに投げるような感じですね。PHP初心者で処理能力など効率がよくわかりませんが1件ずつ投げて取得もいいと思っています。取得した情報(価格など)をDBに保存するといったことをしたいと思っております。 ですが、どのようにすれば実現できるかまったく分からない状態です。 配列表示と保存はなんとかできてます。
yambejp

2016/08/30 08:17

みたかんじ、最終的に全部データをAPIに投げるんですからDBからは最初に全部取り出してしまえばいいでしょう。LIMITも不要です。 一度配列にすべて入れた上で5個ずつ取り出すか、whileで5個保持するかデータの終わりまでループして APIに投げたあと保持した変数をunsetすればよいかと思います
yambejp

2016/08/30 08:18

ちなみに mysql_fetch_array()など「mysql_*」関数は非推奨で 最新版のPHPでは廃止になっています。
marusu

2016/08/30 08:50 編集

回答ありがとうございます。 最初に全部取り出してからの処理も可能なんですね。 配列にすべて入れることは出来ましたがそのあとの処理でforeachなどを使ってみましたがなかなかうまくいきませんでした。おそらく取り出す条件すらあっていないと思います。 コード載せておきます。 $asinlist = array( //asinコード ); $request_asinlist = array(); foreach($asinlist as $asin) { $request_asinlist += $asin; if(count($request_asin_list) == 5) { // APIに投げる処理 $request_asin_list = array(); } } 理想としては全部取り出してから5件ずつ取り出し情報を取得するような感じですが効率悪かったりしますか? PHPverを見ましたら古いやつしか対応していなかったです。
guest

0

MySQLのLIMIT関数を使用すると解決するかと思われます。

sql

1// 上から5件 2SELECT * FROM [テーブル名] LIMIT 5; 3// 5件目から5件 4SELECT * FROM [テーブル名] LIMIT 5, 5; 5// 10件目から5件 6SELECT * FROM [テーブル名] LIMIT 10, 5;

PHP側で動的にLIMITの後ろを変えるといいかもしれません。

投稿2016/08/30 03:59

CyberMergina

総合スコア295

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

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

marusu

2016/08/30 06:04

回答ありがとうございます。 それが100件以上あった場合最後までループさせることは可能ですか? 一つ一つ指定していかないと不可能でしょうか?
marusu

2016/08/30 06:11

説明不足ですみません。 実現したいことはamazon APIにasinコードでリクエストし情報が返ってくるようにしたいんですが、asinコードのリクエストが最大10件なのでとりあえず5件ずつリクエストし情報を取得させたい感じです。 なのでデーターベースから5件ずつを最後までループするような感じに取得できないかと考えていました。
guest

0

「SQLで」と言うことであれば、既にご回答されている方の内容で実現してください。
ただし、発行するSQLの内容によっては、SQLの発行の間でレコードが挿入・削除されると、前回取得したレコードが再度取得されたり、取得していないレコードがスキップされたりすることに気を付けてください。それが許容できるのであれば問題ありません。

許容できない場合についてですが、mysqliでmysqlにアクセスされていると言うことでよろしいですか?

相違なく、検索結果がそれほど大きくないものでしたら、いったん検索結果をmysqli_result::fetchAll()で全て取り出してセッション情報に保持し、リクエストの度に保持した検索結果からarray_slice()で取り出すと言う方法もあります。
最初の検索結果は

php

1array_slice(検索結果, 0, 5);

次の検索結果は

php

1array_slice(検索結果, 5, 5);

といった具合です。

検索結果がとても大きい場合は、mysqli_resultをセッション情報に保持し、リクエストの度に必要なレコード数分(今回の場合は5件)だけ、mysqli_resultのfetch_array()もしくはfetch_object()で取得すると言う方法もあります。
ただし、mysqli_resultをセッション情報に保持すると、mysqlのリソースを消費し続けることになりますので、

  • 不要になったら削除する
  • 1セッションあたりに保持するmysqli_resultは1つに制限する
  • 場合によってはセッションのタイムアウトを短くする

と言った考慮が必要です。
サンプルコード

Amazonへ投げるための処理と言うことですので、

  • テーブルの検索結果を1件づつ取り出して、5件取り出したらAmazonを呼び出す

と言う流れでサンプルを示します。
mysqliは非推奨とのことですのでPDOを使ったMySQLのアクセスで示します。

php

1<?php 2 //アマゾンのAPIを呼び出す処理(適宜修正してください) 3 function toAmazon($requestObjects) { 4 $results = array(); 5 foreach($requestObjects as $resultObject) { 6 array_push($results, $resultObject->variable); 7 } 8 return $results; 9 } 10 11 //MySQLに接続 12 $con = new PDO('mysql:host=<ホスト名>;dbname=<データベース名>;charset=utf8', '<ユーザ名>', '<パスワード>'); 13 14 //SQLの準備 15 $stmt = $con->prepare('select * from test0001'); 16 17 //SQLの実行 18 $stmt->execute(); 19 20 //オブジェクト格納用配列 21 $requestObjects = array(); // Amazonへ投げるオブジェクト(テーブルのレコード)の配列 22 $resultAmazon = array(); // Amazonからの取得したオブジェクトの配列 23 24 while($rowObj = $stmt->fetchObject()) { 25 // 検索結果から1行づつオブジェクト(テーブルレコード)を取りだす 26 // 条件式は「=」で正しい。fetchObject()の戻り値がFALSEだったらループを抜ける。 27 array_push($requestObjects, $rowObj); 28 // Amazonへ投げるオブジェクトの配列に追加 29 if(count($requestObjects) == 5) { 30 // Amazonへ投げるオブジェクトの配列が5個になったらAmazon呼び出し 31 $resultAmazon = array_merge($resultAmazon, toAmazon($requestObjects)); 32 $requestObjects = array(); 33 // Amazonへ投げるオブジェクトの配列を空にする。 34 } 35 } 36 if(count($requestObjects) != 0) { 37 // Amazonへ投げるオブジェクトの配列がに要素が残っていたらAmazon呼び出し 38 $resultAmazon = array_merge($resultAmazon, toAmazon($requestObjects)); 39 $requestObjects = array(); 40 } 41 var_dump($resultAmazon); 42?> 43
  • 「could not find driver」と言うエラーが出力された場合は、php-pdo_mysqlパッケージを追加してください。(例: sudo yum install php-pdo_mysql)
  • while文の条件式で検索結果から1行づつオブジェクト(レコード)を取得しています。オブジェクトからカラムの値は「$rowObj->カラム名」で参照できます。
  • 今回は、取得したオブジェクトをarray_push($requestObjects, $rowObj)で配列に1つづつ追加しています。
  • if(count($requestObjects) == 5)で$requestObjectsに要素が5つ貯まったか判断を行い、貯まっていたらAmazonを呼び出します。
  • Amazonからの結果は、$resultAmazon = array_merge($resultAmazon, toAmazon($requestObjects))で$resultAmazonに追加します。
  • エラー判定処理や、クリーンナップ処理(データベース切断処理)などは割愛しています。

投稿2016/08/30 06:33

編集2016/08/30 09:26
snowfaller

総合スコア125

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

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

snowfaller

2016/08/30 06:35

追記を読みました。今回ご提示した方法では対応できませんね。失礼いたしました。
marusu

2016/08/30 07:25

回答ありがとうございます。 やはりmysqlで実現するのは難しいことなんでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問