![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
はじめて質問させていただきます。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)){ ・・・の行にエラーがあるというところまで解ったのですが。
A 回答 (3件)
- 最新から表示
- 回答順に表示
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行です
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以降でサブクエリがつかえる環境
であればもう少し効率的な書き方もできると思います。
この回答への補足
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 です。今一度ご面倒頂きます様お願いします。
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でしょりすればよいでしょう
この回答への補足
yambejp様、返事が遅れましてすみません。yambejp様のアドバイスの通り、3つのSQLを実行して試してみたのですが苦戦しております。
まず、最初に、エラーが出てしまうと言う事です。エラー内容は次の通りです。
Parse error: syntax error, unexpected '@' in /・・・
行数で言いますと、「SET @count=0;」が記述してある行です。この場所で引っかかってしまって先に進みません。
あと、
>結果をPHPでしょりすればよいでしょう
とは、echoで表示すれば良いという意味でしょうか?
力不足で的外れな補足内容になってしまっておりましたらすみません。よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- MySQL SQL任意に並び替えをしたい 2 2023/08/28 10:47
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
- PHP 記述のおかしいところを教えて下さい。 1 2023/02/03 11:25
- PHP 配列について教えて下さい。 2 2023/03/06 10:29
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
mysql データ更新
-
検索結果にリンクを生成
-
接続ができません
-
phpとmysqlを使っています。
-
LIMIT で条件を満たしているの...
-
バージョン3.23.53からアップグ...
-
phpMyAdminについて
-
PHP+MySQL 接続できません
-
Float型の時の計算結果がおかしい
-
ADOのバージョンを確認する方法
-
MYSQL
-
PHP+ApacheでMySQLに接続できな...
-
SQLのVARCHARとVARCHAR2の違い
-
MYSQLで日本語が入力できない
-
”MySQL”以前は実行できたのです...
-
ページング実装で2ページ目以...
-
phpMyAdimnとコマンドラインで...
-
MySQLとEclipseの接続方法について
-
ODP.NETのバージョン確認
-
MySQLでエラーがでて前に進めま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フォームから送信した値とMySQL...
-
PHPにてSQLから取得したデータ...
-
mysql sqlエラー
-
mysqlで作ったテーブルをphpで...
-
pdfファイルの管理システム
-
MySQLからのデータをページに1...
-
PHPでMySQLを使った検索のプロ...
-
mysql データ更新
-
プレースホルダを使った複数カ...
-
検索機能
-
MySQLでの順位付けについて
-
データを一括で処理する方法に...
-
PHPでMySQLを使った検索のプロ...
-
PDOでDB ページング
-
配列の要素でmysqlに問い合わせ
-
mysql+php リストボックスにつ...
-
MySQLでデータ表示
-
mysqlの置換について2
-
PHP+MYSQLで検索画面を作成し...
-
PHP&MYSQLでの検索システムにつ...
おすすめ情報