MySQLでフィールドの並び替え

このQ&Aのポイント
  • PHP+MySQLで投票システムの構築をして、データベースのフィールドを投票数の多い順に並べ替えたい場合、どのようなクエリを使用すれば良いか分かりません。
  • データベースにINSERTされたデータをSELECTする際に、投票数の多い順に並び替えをしたいと思っていますが、フィールド名が異なるため、今回の仕様でのソートの方法が分かりません。
  • PHP5.3.3とMySQL5.0.77を使用しています。投票システムを構築し、投票数の多い順にフィールドを並び替える方法を教えていただけないでしょうか。
回答を見る
  • ベストアンサー

MySQLでフィールドの並び替え

お世話になります。 PHP+MySQLで投票システムの構築をして、管理画面をもう少し見易くしようと思っております。 現在は、単純に投票されたフィールドに対しカウントアップをさせて1回投票されたら「 1 」、 2回投票されたら「 2 」。 「 3 」、「 4 」、「 5 」・・・という様になっております。 そのデータベースへINSERTされたデータをSELECTする際に、数値( 投票数 )が 多い順に並べ替えをしたいと思っておりますが、どの様なクエリを投げてあげれば良いかが 全く分かりません。 例えば、【 ORDER BY フィールド名 】とすると、対象のフィールド名でソートされるのは、 勿論理解しているつもりですが( プラス DESCで降順等 )、今回は 1、りんご → フィールド名: 【 item1 】 2、みかん → フィールド名: 【 item2 】 3、ぶどう → フィールド名: 【 item3 】 という様にフィールド名は違うので、今回の仕様でのソートという概念が理解できません。 ----------------------------------- ▼スペックについて PHP5.3.3 5.0.77 ----------------------------------- ご教示いただけると幸いです。 どうぞよろしくお願い申し上げます。

  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • utun01
  • ベストアンサー率40% (110/270)
回答No.1

どういうテーブル設計をなさっているのかに拠るかと思います。 「id、種別、投票回数」のようなテーブルになっていれば、 単純にORDER BYで投票回数をソートすればいい気がします。 仰っている内容から察するに、「id、item1、item2、item3」というテーブルになっていて、 それぞれ「item*」に投票回数が加算されていくということでしょうか? だとすれば、テーブル設計をまず考え直すことをお勧めします。 「id、種別、投票回数」のテーブルを作り、 各種別のid、種別を入力したデータを作成されてみては如何でしょうか。

nazal2010
質問者

お礼

ご回答をいただき、ありがとうございます。 >「id、item1、item2、item3」というテーブルになっていて、 >それぞれ「item*」に投票回数が加算されていくということでしょうか? はい、その通りです。 >「id、種別、投票回数」のようなテーブルになっていれば、 >単純にORDER BYで投票回数をソートすればいい 確かに仰る通りですね。 テーブルの構造に問題がありますね。 構築していて何か変だなと思っていましたが、冷静に考えると当然ですよね。 ありがとうございます。助かりました。

その他の回答 (1)

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

クリックしたらインクリメントされるという単純な仕組みだと 同じ人が何度もクリックしますよ? たとえばテーブル構成を question_id,user_id,item_idとして question_id,user_idに複合でunique属性をつけておけば ある質問に対して特定のユーザーは1アイテムしか選択できなくなります 最終的にquestion_idごとにitem_idでgroup by してcountすれば 投票回数の整合性がとれると思います

nazal2010
質問者

お礼

ご回答をいただき、ありがとうございます。 >クリックしたらインクリメントされるという単純な仕組みだと >同じ人が何度もクリックしますよ? 「 投票をする 」ボタンをクリックして、submitする時にIPアドレスの制限を 噛まして重複投稿を避けています。 ( ルータの再起動等でIPアドレスを変更されれば無理ですが・・・ ) >最終的にquestion_idごとにitem_idでgroup by してcountすれば >投票回数の整合性がとれる なるほど、貴重な情報をいただき感謝申し上げます。

関連するQ&A

  • ASP.NET 2.0(C#) GridViewのソート機能をデフォルトで降順にしたい

    GridViewコントロールで「並べ替えを有効」にすると、各フィールドごとに、ヘッダーのリンクをクリックするたびに昇順→降順でソートできるようになりますが、これをあるフィールドだけ、降順→昇順にすることはできないでしょうか? GridView1のSortingイベントで protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) { //hogeフィールドだけデフォルトで降順にしたい if (e.SortExpression == "hoge") { if (e.SortDirection == SortDirection.Ascending) e.SortDirection = SortDirection.Descending; else e.SortDirection = SortDirection.Ascending; } } などとしてみたのですが、これでは常に降順になってしまいます。 よろしくお願いします。

  • SQLでグループ化して降順表示がうまくいきません

    個人的にMysql、php環境でサイトを作っております。 そこで、素人質問で申し訳ありませんが、SQLでお伺いしたい点があります。 例えば下のようなテーブルがあります。 ▽果物テーブル 果物ID | 果物名 | 売れた日付 1 | リンゴ | 2008/11/1 2 | みかん | 2008/11/2 3 | みかん | 2008/11/3 4 | リンゴ | 2008/11/4 これを、 『最近売れた』果物順に、『グループ化』して並べ替えたいと思い、 下記のようなsqlを組みました。 $sql = "SELECT 果物名, FROM 果物テーブル GROUP BY 果物名 ORDER BY 売れた日付 DESC"; 意図としてはリンゴ、みかんの順に並べ替えたいのですが、 みかん、リンゴの順に表示されてしまいます。 想像では、グループ化したとき、古い日付の方が残ってしまい、 | リンゴ | 2008/11/1 | みかん | 2008/11/2 この部分を対象にして日付を降順にしてしまうからだと思うのですが、 これをうまく解決する方法が分かりません。 MSアクセスなどですと先に二重にクエリをかけるなどすることで 「先に降順で並べ替えたクエリを出し、その後グループ化させる」 など処理が簡単なのですが、phpではどうするのかいまひとつ分からず・・・ 申し訳ありませんがよろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP+MySQLでのソートについて

    PHP+MySQLを勉強中です。 例えば、商品テーブルに商品ID、商品名、価格、在庫数の4つのフィールドがあって、その表の各名称をクリックするとソート(例:オークションなどで現在価格をクリックするとソートなど[select * from 商品 order by 価格 asc])できるスクリプトをどのように作成すればよいか教えて下さい。

    • ベストアンサー
    • PHP
  • Excel ピボットテーブルで並び替えをしたい

    Excelでピボットを使って並び替えがうまくいきません 例   A    B    C     1   名前 地区名 施設名 2    太郎 大阪  グランド 3   太郎  大阪 グランド 4   花子   東京 公園 5    花子  東京  公園 6   花子  東京  公園 7   正義 名古屋 球場 8    正義 名古屋 球場 となっているのを並べ替えとフィルタを使用したら 正確にできたのですが、ピボットを使用しピボットのフィールドリスト にある「名前」にチェックを入れてレポートを作成したら意図しない 降順、昇順になりました。よく見ると、ひらがなを使用した「名前」が 昇順の先頭になり、行番号1~6まで昇順、7~20まで、21~33というような結果になっています。行レベルの右にある▼をクリックして 昇順、降順をクリックしても同じ結果でした。(すべて選択)などを見ると昇順、降順の結果通りに並んでいます。できれば、ピボットで 昇順、降順を意図した結果(ここでは五十音順)にしたいのですが わかる方教えてください

  • MySQL insertができない

    商品名とその値段を挿入しようとおもっているのですが、下記のようなエラーがでて先に進めずにいます。 Query failed: Unknown column 'item' in 'field list' <?php if($contact=mysql_connect("host","admin","root")){ echo "サーバに接続しました。<br>"; } mysql_select_db("watanabe", $contact); $query = 'INSERT INTO list(item,price) VALUES("りんご","100")'; $result = mysql_query($query) or die('Query failed: ' . mysql_error()); if($result){ echo"追加に成功しました。"; }else{ echo"追加に失敗しました。"; } ?> ご回答願えますでしょうか?

    • ベストアンサー
    • PHP
  • ACCESS2000 のテーブルが並べ替えできません

    おはようございます。 いつもありがとうございます。 ACCESSのテーブルを開くと、通常なら項目名を右クリックすると昇順、降順で並び替え ができますが そのメニューがグレーアウトでソートできないのです。 メニューバーの並べ替えの部分も同様にグレーアウトしています。 PC DELL DESKTOP OS WINDOWS2000 どうすれば並べ替えできるでしょうか?

  • Mysqlとphpでソートや更新時の効率的な処理

    カラムの作成日時と更新日時のそれぞれでソート、 作成日時当日はNEWの文字を入れる。というものを作りたいと思っています。 <?php $cer = "SELECT * FROM data_data WHERE 1"; function orderbyset($cul, $sc, &$cer){ $cer .= " ORDER BY ".$cul." ".$sc; } if(isset($_GET['orderby'])){ switch($_GET['orderby']){ case 'md_asc': orderbyset('modified_date','ASC',$cer); break; case 'md_desc': orderbyset('modified_date','DESC',$cer); break; case 'cd_asc': orderbyset('create_data','ASC',$cer); break; case 'cd_desc': orderbyset('create_data','DESC',$cer); break; } } $acc = mysql_connect(ホスト,ユーザー,パスワード); $que = mysql_query($cer,$acc); $html = ""; while($row = mysql_fetch_array($que)){ $id = $row["id"]; $name = $row["name"]; $modified_date = $row["modified_date"]; $create_data = $row["create_data"]; $daydiff = floor((strtotime($modified_date)-strtotime($create_data))/(3600*24)); if($daydiff==0){$datatext = 'new';}else{$datatext='';} $html .= "<tr><td>$id</td><td>$name</td><td>$modified_date</td><td>$create_data</td><td>$datatext</td></tr>\n"; } ?> <html lang="ja"> <head> <title></title> </head> <body> <p>更新日時順<br /> <a href="data-sort.php?orderby=md_asc">昇順</a> <a href="data-sort.php?orderby=md_desc">降順</a> </p> <p>作成日時順<br /> <a href="data-sort.php?orderby=cd_asc">昇順</a> <a href="data-sort.php?orderby=cd_desc">降順</a> </p> <table><?php echo $html; ?></table> </body> </html> +---------------+-----------+------+-----+-------------------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+-----------+------+-----+-------------------+-------+ | id | int(11) | NO | PRI | NULL | | | name | char(10) | NO | | NULL | | | modified_date | timestamp | NO | MUL | CURRENT_TIMESTAMP | | | create_data | timestamp | YES | MUL | NULL | | +---------------+-----------+------+-----+-------------------+-------+ modified_dateの属性にはon update CURRENT_TIMESTAMPを設定し、 カラムのデータを変えるとmodified_dateが更新され、create_dataはそのままです。 SELECT id,name,modified_date,create_data,IF(`create_data`>CURDATE() - INTERVAL 0 DAY,'NEW',DATE_FORMAT(`create_data`,'%Y/%m/%d')) AS `ddd` FROM `data_data` http://okwave.jp/qa/q3058491.htmlでの方法がありました。 $daydiff = floor((strtotime($modified_date)-strtotime($create_data))/(3600*24)); if($daydiff==0){$datatext = 'new';}else{$datatext='';} 「あるカラムの情報が変わったら○○させる」といったことをいくつか追加していきたいので、 パフォーマンスが落ちることを少しでも避けるためにphpで処理するようにしましたが、一般的にはどちらを使うものなのでしょうか。 また、ifばかりにならないようにswitchを使ったのですが、ソートもいろいろ追加していきたく、そうなると今度はswitchが多くなってしまいます。 switchやifを使わずにスマートにやれる方法はないでしょうか。

    • ベストアンサー
    • PHP
  • php キーソート キーが重複した場合の処理

    php 入門者です。よろしくお願いします。 phpでcsvファイルを読み込み、連想配列に代入し、いろいろなキーでソートしたいと考えております。 例えば以下のようなcsvファイルがあるとします。 商品コード,商品名,価格,在庫数 001,りんご,100,5 002,みかん,200,10 003,ぶどう,200,3 004,バナナ,100,10 005,柿,300,5 このデータを、商品コードをキーにした連想配列を作成し、ksortなどでソートさせることはできました。 しかし、価格や在庫数でソートしようと思い、同じようにそれらをキーにした連想配列を作成しソートさせると、キーが重複してしまい、上書きされてしまいます。 そこで質問なのですが、 価格や在庫数でソートし、もし価格や在庫数が同じならば、商品コード順にソートする。 このようなソート方法を教えて下さい。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • Mysqlにhtmlのフォームから登録できません。

    WindowsでphpからMysqlにデータを登録しようと思っているのですが、うまくいきません。 データベースの内容をHTML,PHPで書き出すことは正常にできたのですが、登校フォームから入力してもデータが書き込まれません。フォームのHTMLはおそらく間違ってないと思います。 これが受け入れ側のファイルの内容です。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <?php extract($_POST); mysql_connect('localhost','root','パスワード'); mysql_select_db('データベース名'); $sql = "insert into テーブル名 values('フィールド1の値','フィールド2の値','フィールド3の値','フィールド4の値',0)"; mysql_query($sql); ?> </body> </html> ファイル名は.phpの拡張子で保存してます。 Mysqlの環境設定はできているのに何故データを登録できないのでしょうか? 詳しい方どうか教えてください。よろしくお願いします。

  • フィールド(項目)を縦に設定したいのですが...

    現在PHP+MySQLにて検索アプリを作成中です。 そこで、検索結果一覧から各アイテムの先頭フィールドに「checkbox」を設置して、 ユーザーにアイテムを複数選択させ、別画面にてアイテムの詳細を表示して比較するというプログラムを考えています。 実は、先日も「checkbox」の件でこちらにお世話になったのですが、。 素晴らしい回答者様に出会い、チェック後のアイテム表示を実現させることができました。 っで、今回実現させたいのは、フィールド(各項目)を横に設定するのではなく、 縦に設定したいのです。チェックしたアイテムを比較するために横に表示されるようにしたいのです。自分なりに考えて試してみたのですが、やはり解決に至りませんでした。 実現したいことは、 ECナビ http://kakaku.ecnavi.jp/item_compare/?check=2012337707_2011131960_2012080303_2017103320_2017103319 このような感じです。 スキル不足でお恥ずかしいのですが、 ご教授、何卒宜しくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう