• 締切済み

MySQLでの順位付けについて

はじめて質問させていただきます。MySQLについての質問なのですが、 以下のようなテーブル(goods)があります テーブル名 goods 商品カテゴリ category 商品名 name 商品価格 price テーブル名 goods ---------------- (category)(name) (price) fashion  バッグ  15000       food   ラーメン 3000       fashion  ポーチ  5000         fashion  腕時計  16000       food   メロン  2000   ----------------        ↓ ----------------- (rank)(category)(name) (price) 1 fashion  腕時計  16000       2 fashion  バッグ  15000         3 fashion  ポーチ  5000     ----------------- 上のテーブルで商品カテゴリ(category)の中の(fashion)のみを抽出して、そして商品価格(price)に関して降順に並べ替え、更に順位をつけたいのですが、以下のように 自分なりに書いてみましたがエラーが出てしまいます。色々と過去の質問等を参考にしたのですが、何卒お力添えの程よろしくお願い致します。 ------------------------------------------------------------------------------------------------ <? $conn = mysql_pconnect ("localhost", "xxx", "xxx") or die ('I cannot connect to the database.'); mysql_select_db ("xxx",$conn); $sql= "select x.category,x.price count(*) as rownum from goods as x,goods as y where x.price < y.price or x.price = y.price and x.category > y.category or x.price = y.price and x.category = y.category group by x.category,x.price having category = 'fashion' order by x.price desc,x.category"; ; $res = mysql_query($sql); while($row = mysql_fetch_array($res)){ echo "<table cellpadding='0' cellspacing='0'>"; echo "<tr><td>"; echo "$row[rank]" echo "</td>"; echo "<td>"; echo "$row[name]" echo "</td>"; echo "<td>"; echo "$row[price]" echo "</td></tr>"; echo "</table>"; } ?> --------------------------------------------------------------------------------------------------- while($row = mysql_fetch_array($res)){ ・・・の行にエラーがあるというところまで解ったのですが。

  • MySQL
  • 回答数3
  • ありがとう数10

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

すみません、mysqlのバージョンによって変数の評価順位がことなるので ご指摘のようになるようです。 mysql5だとこんな感じでしょうか・・・ もう少しチューニングできそうですが、ぱっとおもいついたのでスピードは いまいちかもしれません。 select rank,g.category,g.name,g.price from goods as g inner join (select distinct @p:=price as price ,(select count(*) from goods where category='fashion' and price>@p)+1 as rank from goods) as temp using(price) where g.category='fashion' order by g.price DESC これならSQLの発行は1行です

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

個々の状況により若干ちがいがありますが、総じて以下のようになります $sql="SET @count=0"; $res = mysql_query($sql); $sql="create temporary table temp select price,@count+1 as RANK ,@count:=@count+count(*) as count from goods where category='fashion' group by price order by price DESC"; $res = mysql_query($sql); $sql="select rank,g.category,g.name,g.price from goods as g inner join temp using(price) where g.category='fashion' order by g.price DESC"; $res = mysql_query($sql); while($row = mysql_fetch_array($res)){ ・・・ } なお今回例示したSQLは古いバージョンでも対応できるように テンポラリを使いましたが、MySQL4.1以降でサブクエリがつかえる環境 であればもう少し効率的な書き方もできると思います。

syosin333
質問者

補足

yambejp様、お世話になります。何度も面倒を見ていただき、恐縮しております。ひとつひとつyambejp様に書いていただいた記述を丸写しするのではなく、意味を確認しながら、以下のように書いてみました。 <? $conn = mysql_pconnect ("localhost", "xxx", "xxx") or die ('I cannot connect to the database.'); mysql_select_db ("xxx",$conn); $sql="SET @count=0"; $res = mysql_query($sql); $sql="create temporary table temp select price,@count+1 as RANK ,@count:=@count+count(*) as count from goods where category='fashion' group by price order by price DESC"; $res = mysql_query($sql); $sql="select rank,g.category,g.name,g.price from goods as g inner join temp using(price) where g.category='fashion' order by g.price DESC"; $res = mysql_query($sql); while($row = mysql_fetch_array($res)){ echo "<table cellpadding='0' cellspacing='0'>"; echo "<tr><td>"; echo "$row[rank]"; echo "</td>"; echo "<td>"; echo "$row[name]"; echo "</td>"; echo "<td>"; echo "$row[price]"; echo "</td></tr>"; echo "</table>"; } ?> しかしながら、価格の降順にはなるのですが、順位の数字が以下のようにばらばらになってしまい、また順位の数字も(1,2,3)の3つしか表示されません。やはりどこか私の記述に間違いがあるのでしょうか? ----------------- (rank)(name) (price) 1   腕時計  16000       3   バッグ  15000       2   ポーチ  5000     3     傘  4000     2   ハンカチ 2000     ・ ・ ・ ----------------- MySQLのバージョンはMySQL5.0 です。今一度ご面倒頂きます様お願いします。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

とりあえずSQLで順位をつけるとこまでやってみました SET @count=0; create temporary table temp select price,@count+1 as RANK ,@count:=@count+count(*) as count from goods where category='fashion' group by price order by price DESC; select rank,g.category,g.name,g.price from goods as g inner join temp using(price) where g.category='fashion' order by g.price DESC この3つのSQLを実行し、結果をPHPでしょりすればよいでしょう

syosin333
質問者

補足

yambejp様、返事が遅れましてすみません。yambejp様のアドバイスの通り、3つのSQLを実行して試してみたのですが苦戦しております。 まず、最初に、エラーが出てしまうと言う事です。エラー内容は次の通りです。 Parse error: syntax error, unexpected '@' in /・・・ 行数で言いますと、「SET @count=0;」が記述してある行です。この場所で引っかかってしまって先に進みません。 あと、 >結果をPHPでしょりすればよいでしょう とは、echoで表示すれば良いという意味でしょうか? 力不足で的外れな補足内容になってしまっておりましたらすみません。よろしくお願いします。

関連するQ&A

  • mysql

    phpでmysqlのテーブルからデータを引っ張ってくる構文なのですが $pdo = new PDO("mysql:dbname=データベース名", "root", "root"); $st = $pdo->query("SELECT * FROM テーブル名"); while ($row = $st->fetch()) { $name = htmlspecialchars($row['テーブル名']); $price = htmlspecialchars($row['price']); echo "<tr><td>$name</td><td>$price 円</td></tr>"; 上記のデバックに手こずっております。 自分の知りたいところはカタカナ、漢字の使われているところが正しいのか知りたいです。 またもっと楽な方法があれば教えて頂きたいです。 馬鹿でスミマセンがよろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQLで昇順に並べ替え

    MySQL(データベース)で商品名と価格を格納したテーブル(syouhin)があります。商品名のキーワードを入力するフォーム(form.html)とデータを受け取る(kensaku.php)があり、以下のようにデータを表示させています。 <!-- form.html --> <html> <head> <title>商品名と価格</title> </head> <body> <form method="get" action="kensaku.php"> <input type="text" name="name"> <input type="submit" name="submit" value="検索"> </form> </body> </html> //kensaku.php <? $name=$_REQUEST["name"]; $conn = mysql_connect ("localhost", "username", "password") or die ('接続できませんでした'); mysql_select_db ("db",$conn); //クエリ生成 $sql = "select * from syouhin where name like '%$name%'"; $res = mysql_query($sql); while($row = mysql_fetch_array($res)){ echo "<table border='1' cellpadding='0' cellspacing='0'>"; echo "<tr>"; echo "<td>".$row[name]."</td>"; echo "<td>".$row[price]."</td>"; echo "</tr>"; echo "</table>"; } ?> ここから質問なんですが、今結果が表示されているまさにそのページで、並べ替えをしたいのです。よく検索結果の並べ替えで、[価格の安い順に並べる]をクリックすると並び変わるのがありますよね。それと同じ事をしたいのです。 僕が考えた方法は、もう一つのページ(例えば、kensaku_asc.php)を作って、 $sql = "select * from syouhin where name like '%$name%'"; の部分だけを $sql = "select * from syouhin where name like '%$name%' order by price"; に変えて、そのページにリンクさせる。でもその場合、form.htmlから受け取ったデータ(ここでは商品名のキーワード)を引き継ぐという事ができないので、そのあたりのところのヒントをいただければと存じます。よろしくお願いします。

    • 締切済み
    • PHP
  • MySQL 5 PHP 5 データの受け渡しについて 困ってます。。

    MySQL 5 PHP 5 データの受け渡しについて 困ってます。。 下記内容で困ってます。機能としては (1)プロダクトテーブルからデータを読み込み表示。 ※プロダクトテーブルには商品データが8件登録されています。 (2)注文ボタンが押されたら受注テーブルにデータをカキコミ。 なんですが。。。 プロダクトテーブルから読み込んだデータを受注テーブルに書き込むと $product_id がいつも8(受注テーブルデータの一番最後の数字) $product_name  同じ $product_price 同じ ・・・ になってしまいます。 whileループしているので変数に代入するのも繰り返されて一番最後のデータが いつも格納されている状態だと思うのですが、この解決策を教えて下さい! 最近始めたばかりで良く理解出来ないので噛み砕いて教えてくれる方お願いします>< <?php //---------------------------------------- // □:テーブルからデータを読む //---------------------------------------- $mysql->query("SELECT * FROM products ORDER BY product_id") or die(mysql_error()); while($row = $mysql->fetch()){ $product_id = $row["product_id"]; $product_name = $row["product_name"]; $product_price = $row["product_price"]; echo <<<EOT <tr> <td align="center">$product_id<input name="product_id" type="hidden" value="$product_id" size="10" /></td> <td align="center">$product_name<input name="product_name[$product_id]" type="hidden" value="$new_product_name" size="10" /></td> <td align="right">$product_price<input name="product_price[$product_id]" type="hidden" value="$new_product_price" size="10" /></td> <td><input name="new_use_date[$product_id]" type="text" value="$new_use_date" size="20" /></td> <td><input name="new_use_time[$product_id]" type="text" value="$new_use_time" size="20" /></td> <td><input name="remarks[$product_id]" type="text" value="$new_remarks" size="40" /></td> <td><input name="submit_add" type="submit" value="注文する" /></td> </tr> EOT; } //ここまでwhileループ[終了の閉じカッコ] ?>

    • ベストアンサー
    • MySQL
  • mysqlの結果セットを配列に

    while($row=mysql_fetch_array($res)){ echo "<form action=kousin.php method=post>"; echo "<TD bgcolor=#FFFFFF><input type='text' name=zaiko[] value=". $row["注文"] . "></td>"; echo "<input type=hidden name=store1 value=". $row["注文"] .">"; --------------------------------------------------- $zaiko[]=$_POST["zaiko[]"]; 上記のようなイメージでフォームから送った結果セットを配列として格納したいのですが、どのようにしたら良いのでしょうか?よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPとmysqlに関して

    while($row3 = mysql_fetch_array($res3)){ $r3 = $row3['name']; $d3 = $row3['day']; while($row = mysql_fetch_array($res)){ $r = $row['name']; if($days==$d3 and $r==$r3){ echo '<a href="tops2.php?id='.$row['id'].'"><div class="aaa"><div style="padding-top:10px">'.$row['name'].'<br><font color="red">出勤中</font></div></div></a>'; }else{ echo '<a href="tops2.php?id='.$row['id'].'"><div class="aaa"><div style="padding-top:15px">'.$row['name'].'</div></div></a>'; } }} 簡単に説明すると、テーブルAのnameとテーブルBのnameが合致したら出勤中と表示させたいのですが、何故か合致したデータの一部しか出勤中と出ません。 なにがおかしいですか??

    • ベストアンサー
    • PHP
  • PHP mysql_fetch_assocについて

    いつもお世話になっております。早速ですが下記のソースにて、SQLのクエリではレコードが2行(phpMyAdminで確認)出てきます。何故whileが繰り返してくれないのか分からず悩んでおります。($counterも2で止まる)長文でお手数ですがどうかお力添えの程お願い致します。(文字数制限にてSQL文は省略してます) $sql = "SELECT * FROM 省略"; $res = mysql_query($sql,$conn); echo "<form method=\"POST\" action=\"edit.php\">"; echo "<table class=\"login mb10\" border=\"1\" cellspacing=\"0\" width=\"650\">"; echo "<tr><td class=\"form\">日にち</td><td class=\"form\" colspan=\"3\">".$date."</td></tr>"; $counter = 1; //これが繰り返してくれない while($stadium = mysql_fetch_assoc($res)){ //2回目以降はtableタグを付加 if($counter > 1){echo "<table>";} echo "<tr><td>試合順</td><td colspan=\"2\">".$counter."試合目</td><td>対象</td></tr>"; echo "<tr><td>対戦カード・時間</td><td>"; //チーム情報 $sql = "SELECT * FROM 省略"; $res = mysql_query($sql,$conn); echo "<select name=\"team1_".$counter."\">\n"; while($team1 = mysql_fetch_assoc($res)){ echo "<option value=\"".$team1["team_id"]."\""; if($row["team1"] == $team1["team_id"]){echo " selected";} echo ">".$team1["team_name"]."</option>\n"; } echo "</select>対"; $sql = "SELECT * FROM 省略"; $res = mysql_query($sql,$conn); echo "<select name=\"team2_".$counter."\">\n"; while($team2 = mysql_fetch_assoc($res)){ echo "<option value=\"".$team2["team_id"]."\""; if($stadium["team2"] == $team2["team_id"]){echo " selected";} echo ">".$team2["team_name"]."</option>\n"; } echo "</select></td>\n"; //時刻を反転させる $date_s = strrev($stadium["schedule_time"]); $minute_s = strrev(substr($date_s,0,2)); $hour_s = strrev(substr($date_s,2,2)); echo "<td><select name=\"hour_".$counter."\">"; $hour = 8; while($hour < 22){ echo "<option value=\"".$hour."\" "; if($hour_s == $hour){echo "selected";} echo ">".$hour."</option>"; $hour ++; } echo "</select>時"; echo "<select name=\"minute_1\">"; $minute = 0; while($minute < 60){ echo "<option value=\"".$minute."\" "; if($minute_s == $minute){echo "selected";} echo ">".$minute."</option>"; $minute = $minute + 15; } echo "</select>分</td>\n"; //チェック echo "<td rowspan=\"2\"><input type=\"checkbox\" name=\"delete_".$counter."\" value=\"1\"></td></tr>\n"; echo "<tr><td class=\"form\">審判・場所</td><td>"; //チーム情報 $sql = "SELECT * 省略"; $res = mysql_query($sql,$conn); echo "<select name=\"umpire1_".$counter."\">"; while($umpire1 = mysql_fetch_assoc($res)){ echo "<option value=\"".$umpire1["team_id"]."\" "; if($umpire1["team_id"] == $stadium["umpire1"]){echo "selected";} echo ">".$umpire1["team_name"]."</option>"; } echo "</select>&"; $sql = "SELECT * FROM 省略"; $res = mysql_query($sql,$conn); echo "<select name=\"umpire2_".$counter."\">"; while($umpire2 = mysql_fetch_assoc($res)){ echo "<option value=\"".$umpire2["team_id"]."\" "; if($umpire2["team_id"] == $stadium["umpire2"]){echo "selected";} echo ">".$umpire2["team_name"]."</option>"; } echo "</select></td>\n"; //球場データ $sql = "SELECT * FROM 省略"; $res = mysql_query($sql,$conn); echo "<td>"; if($counter == 1){ echo "<select name=\"stadium_".$counter."\">"; while($sta = mysql_fetch_assoc($res)){ echo "<option value=\"".$sta["stadium_id"]."\" "; if($sta["stadium_id"] == $stadium["stadium"]){echo "selected";} echo ">".$sta["stadium_name"]."</option>"; } echo "</select>"; }else{ echo "&nbsp;"; } echo "</td></tr>\n"; echo "</table>"; $counter++; } echo "<table>変更するテーブル</table>"; echo "</form>";

    • ベストアンサー
    • PHP
  • mysql sqlエラー

    先ほども質問したのですが再度質問させていただきます mysql limitページ分割を行っていてエラーは消せたのですが今度 SQLエラーになり出来ません 前の人が質問したのを参考にしてつくったのですがうまくいかず困っています 検索結果を10件ずつ表示して googleみたいに 1l 2l 3 みたいな感じやりたいです <body> <?php error_reporting(E_ALL ^ E_NOTICE); //データベースに接続 if (!$con = mysql_connect("localhost", "root", "admin")) { echo "接続エラー" ; exit ; } //データベースを選択 if (!mysql_select_db("db_test", $con)) { echo "データベース選択エラー" ; exit ; } //LIMITを使ったSELECT文を作成 $sql = "select * from tbl_test where (氏名 LIKE '%{$_GET['name']}%') or (住所 LIKE '%{$_GET['name']}%')"; $sql = "limit" . $page * 10 . ", 10" ; //SQL実行 if (!$res = mysql_query($sql)) { echo "SQLエラー<BR>" ; exit ; } //検索結果表示 echo "<table border=1>" ; echo "<tr> <th>番号</th> <th>氏名</th> <th>住所</th> <th>操作</th> </tr>" ; while($row = mysql_fetch_array($res)){ $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); echo "<tr> <td>$ID</td> <td>$NAME</td> <td>$ADDR</td> <td><a href='edit.php?番号=$ID'>修正</a> <a href='delete.php?番号=$ID'>削除</a></td> </tr>"; //検索条件に該当する全データの件数取得 $sql = "select count(*) from tbl_test " ; $sql = "where (氏名 LIKE '%{$_POST['name']}%') or (住所 LIKE '%{$_POST['name']}%')"; if (!$res = mysql_query($sql)) { echo "SQLエラー<BR>" ; exit ; } $row = mysql_fetch_array($res) ; $cnt = $row[0] ; //ページ表示 if(!$cnt > 10) echo ceil($cnt / 10), "ページの中の", $page + 1, "ページ目を表示<br>" ; //前の10件 if ($page_num != 0) { echo "<a href = find.php?name=".$name. ". $page -1.>" ; echo "&lt 前の10件"; } //次の10件 if (($page_num + 1)*10 < $cnt) { echo "<a href = find.php?name=".$name. ". $page +1.>" ; echo " 次の10件 &g</a>t" ; } //結果セットの開放 mysql_free_result ($res) ; //データベースから切断 mysql_close($con) ; } ?> </body> </html>

    • ベストアンサー
    • MySQL
  • 『MySQL』どこがまちがってますでしょうか?!

    <table> <tr> <th>name</th> <th>telno</th> </tr> <?php if( ! $db = mysql_connect( 'localhost', 'ユーザー名', 'パスワード') ){ die( ’MySQL接続失敗' ); mysql_select_db('test', $db ); $sel = mysql_query('SELECT name,telno FROM phone'); while ($row = mysql_fetch_array ($sel)) { echo "<tr>"; echo " <td>".$row["name"]."</td>"; echo " <td>".$row["telno"]."</td>"; echo "</tr>"; } mysql_free_result ($sel); mysql_close($db); ?> </table> 上記のソースを自分のレンタルサーバーに置いてみてアクセスしたところ 何も表示されません。 何がおかしいでしょうか? 状態   ・Win MYSQLLadmin 1.4が起動していて青信号状態    このソフトの中では PC名   Ltest Lphone (コマンドプロンプトからは mysql> select * from phone; で中にデータは入っていることが確認できた。    ・サーバーはPHP可。(MySQL可でないとダメ?!)) 何がおかしいんでしょ?! 自分で考える不安要素は、 PHPは<?php ~?> で挟むんで使うことは先日知ったばかりですが、PHP自体が動いてるはずと仮定してます。 またこのphoneのテーブルの中身はMySQLのサーバーに格納されてるのでしょうか?! それとも自分のPCのローカル?! PLEASE H E L P M E !!!

    • ベストアンサー
    • MySQL
  • mysql limitページ分割

    前の人が質問したのを参考にしてつくったのですがうまくいかず困っています 検索結果を10件ずつ表示して googleみたいに 1l 2l 3 みたいな感じやりたいです <html> <body> <?php //データベースに接続 if (!$con = mysql_connect("localhost", "root", "admin")) { echo "接続エラー" ; exit ; } //データベースを選択 if (!mysql_select_db("db_test", $con)) { echo "データベース選択エラー" ; exit ; } //LIMITを使ったSELECT文を作成 $sql = "select * from tbl_test where (氏名 LIKE '%{$_POST['name']}%') or (住所 LIKE '%{$_POST['name']}%')"; $sql = "limit" . $page_num*10 . ", 10" ; //SQL実行 if (!$res = mysql_query($sql)) { echo "SQLエラー<BR>" ; exit ; } //検索結果表示 echo "<table border=1>" ; echo "<tr> <th>番号</th> <th>氏名</th> <th>住所</th> <th>操作</th> </tr>" ; while($row = mysql_fetch_array($res)){ $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); echo "<tr> <td>$ID</td> <td>$NAME</td> <td>$ADDR</td> <td><a href='edit.php?番号=$ID'>修正</a> <a href='delete.php?番号=$ID'>削除</a></td> </tr>"; //検索条件に該当する全データの件数取得 $sql = "select count(*) from tbl_test " ; $sql = "where (氏名 LIKE '%{$_POST['name']}%') or (住所 LIKE '%{$_POST['name']}%')"; if (!$res = mysql_query($sql)) { echo "SQLエラー<BR>" ; exit ; } $row = mysql_fetch_array($res) ; $cnt = $row[0] ; //ページ表示 if(!$cnt > 10) echo ceil($cnt / 10), "ページの中の", $page_num + 1, "ページ目を表示<br>" ; //前の10件 if ($page_num != 0) { echo "<a href = find.php?name=",$name, ", $page_num -1.">" ; echo "&lt 前の10件"; } //次の10件 if (($page_num + 1)*10 < $cnt) { echo "<a href = find.php?name=",$name, ", $page_num +1.">" ; echo " 次の10件 &g</a>t" ; } //結果セットの開放 mysql_free_result ($res) ; //データベースから切断 mysql_close($con) ; ?> </body> </html> Parse error: syntax error, unexpected '前の10件' (T_STRING), expecting ',' or ';' というエラーが出て自分なりにバグを消しているのですがまだエラーが消えずに困っています

    • ベストアンサー
    • MySQL
  • MySQL + PHP 同じテーブル内でのクエリについて

    PHP+MySQL勉強中の初心者です。 PHP+MySQL環境でのクエリについて、以下の条件でのクエリ結果を求めたいのですが、上手くできませんので、質問させてください。 MySQLのテーブルは以下のようになっています。 date        no   name ---------------------------- 2009-12-10   15   takada 2009-12-15   10   hirooka 2009-12-18   13   wakada 2010-01-10   15   takada 2010-01-11   13   wakada ----------------------------- 出力させたいクエリは、前月データを元にno列をKEYとした重複チェックです。 前月データを全件出力し、当月データに同じnoがあった場合、当月日付を 表示させたいと思っています。 (PHPで希望する出力結果) date       no   name     date2 ---------------------------------------- 2009-12-10  15   takada   2010-01-10 2009-12-15  10   hirooka 2009-12-18  13   wakada   2010-01-11 ----------------------------------------- 以下のようなソースでは、1行のみの出力結果しか表示されず、 whileの使い方に問題があると思うのですが、どのように解決すれば良いのかが解りません。 どうか、解決策をよろしくお願いいたします。 $mysql->query("SELECT * FROM xxxx where date LIKE '$y-$m%'"); while($row = $mysql->fetch()){ $date = $row["date"]; $no = $row["no"]; $name = $row["name"]; $mysql->query("SELECT * FROM xxxx where upddate LIKE '$y2-$m2%' and no = '$no'"); while($row = $mysql->fetch()){ $date2 = $row["date"]; echo <<<EOT <td>$date</td> <td>$no</td> <td>$name</td> <td>$date2</td><tr> EOT; } }

    • 締切済み
    • PHP