- ベストアンサー
Mysqlレコード集計について
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
前回とほぼロジックは同じです。 SELECT player_id,sum(truncate(c/3,0)) as point from ( SELECT( SELECT MAX(d) FROM hoge where h1.d>d and h1.win!=win and h1.player_id=player_id )AS pre ,win,player_id,count(*) as c FROM hoge AS h1 GROUP BY pre,win,player_id ) as sub where win=1 group by player_id
その他の回答 (4)
- yambejp
- ベストアンサー率51% (3827/7415)
>SQL文が理解できませんでした・・・ すみません。はしょりすぎましたね。 くわえて、バグがありましたのでついでになおします。 以下のように段階を分けて組んでいけばよいでしょう。 (1)まず、自分より以前でwinが自分以外のものの最大値をえます。 SELECT( SELECT MAX(d) FROM hoge where h1.d>d and h1.win!=win )AS pre ,win FROM hoge AS h1 こうすると連勝、連敗中の直前データがpreに表示されます。 (2)preとwinの組み合わせで連勝連敗記録を拾います。 SELECT ( SELECT MAX(d) FROM hoge where h1.d>d and h1.win!=win ) AS pre ,win,count(*) as c FROM hoge AS h1 group by pre,win (3)これに条件を設定(3連勝以上=winが1でcが3以上)してカウントすればよいでしょう。 SELECT count(*) FROM( SELECT ( SELECT MAX(d) FROM hoge where h1.d>d and h1.win!=win )AS pre ,win,count(*) as c FROM hoge AS h1 group by pre,win ) AS sub WHERE win=1 AND c>=3
お礼
yambejp様ありがとうございます。 補足までつけていただきありがとうございました。 もうひとつ御教授いただけると幸いです。 |seq|player_id| date |win| | 1| 1|2010/04/01| 0| | 2| 1|2010/04/02| 1| | 3| 1|2010/04/03| 1| | 4| 1|2010/04/04| 1| | 5| 1|2010/04/05| 1| | 6| 1|2010/04/06| 1| | 7| 1|2010/04/07| 1| | 8| 2|2010/04/01| 1| | 9| 2|2010/04/02| 1| | 10| 2|2010/04/03| 1| [player_id]=勝利投手 3連勝毎にボーナスポイント1を与えたいと考えております。 (5連勝1ポイント・6連勝2ポイント・7連勝2ポイント) sqlで可能でしょうか? 以下のような形で出力できればと考えております。 |player_id|point| | 1| 2| | 2| 1| よろしくお願いいたします。
- yambejp
- ベストアンサー率51% (3827/7415)
こんな感じでいけませんか? ちなみにテーブル名=hoge、dateは予約語なのでdとしました SELECT count(*) from( SELECT coalesce(( SELECT MAX(d) FROM hoge where h1.d>d and h1.win!=win ) ,d - interval 1 day)AS pre ,win,count(*) as c FROM hoge AS h1 group by pre,win) as sub where win=1 and c>=3
お礼
yambejp様ありがとうございます これだけ短いSQLで実現可能だとは・・・ ただ私には、SQL文が理解できませんでした・・・ ありがとうございました
- root139
- ベストアンサー率60% (488/809)
下記の様に仮定して、考えました。 ・win には必ず0(負け)か1(勝ち)の値が入っている ・Dateは重複が無い --------------------------------------------------------- SELECT COUNT(*) FROM t_game a WHERE ( win = 0 AND ( SELECT COUNT(*) FROM t_game b WHERE b.win = 1 AND a.date < b.date AND NOT EXISTS ( SELECT 1 FROM t_game c WHERE c.win = 0 AND a.date < c.date AND c.date < b.date ) ) >= 3 ) OR ( win = 1 AND NOT EXISTS (SELECT 1 FROM t_game d WHERE d.date < a.date) AND ( SELECT COUNT(*) FROM t_game e WHERE e.win = 1 AND a.date < e.date AND NOT EXISTS ( SELECT 1 FROM t_game f WHERE f.win = 0 AND a.date < f.date AND f.date < e.date ) ) >= 2 ) ; --------------------------------------------------------- MySQLでは試してませんが、ver 5.1 では動作すると思います。 考え方としては下記の条件に当てはまるものを合計しました。 ・winが0で、次のwinが0の行との間に在る行の数が3以上の行 ・先頭行で、winが1で、次のwinが0の行との間に在る行の数が2以上の行
お礼
root139様ありがとうございます 回答ありがとうございました。 お蔭様で本来望んでいる通りの結果を出す事が出来ました。 もうひとつ御教授いただけると幸いです。 |seq|player_id| date |win| | 1| 1|2010/04/01| 0| | 2| 1|2010/04/02| 1| | 3| 1|2010/04/03| 1| | 4| 1|2010/04/04| 1| | 5| 1|2010/04/05| 1| | 6| 1|2010/04/06| 1| | 7| 1|2010/04/07| 1| | 8| 2|2010/04/01| 1| | 9| 2|2010/04/02| 1| | 10| 2|2010/04/03| 1| [player_id]=勝利投手 3連勝毎にボーナスポイント1を与えたいと考えております。 (5連勝1ポイント・6連勝2ポイント・7連勝2ポイント) sqlで可能でしょうか? 以下のような形で出力できればと考えております。 |player_id|point| | 1| 2| | 2| 1| よろしくお願いいたします。
補足
root139様ありがとうございます 回答ありがとうございました。 お蔭様で本来望んでいる通りの結果を出す事が出来ました。 もうひとつ御教授いただけると幸いです。 |seq|player_id| date |win| | 1| 1|2010/04/01| 0| | 2| 1|2010/04/02| 1| | 3| 1|2010/04/03| 1| | 4| 1|2010/04/04| 1| | 5| 1|2010/04/05| 1| | 6| 1|2010/04/06| 1| | 7| 1|2010/04/07| 1| | 8| 2|2010/04/01| 1| | 9| 2|2010/04/02| 1| | 10| 2|2010/04/03| 1| [player_id]=勝利投手 3連勝毎にボーナスポイント1を与えたいと考えております。 (5連勝1ポイント・6連勝2ポイント・7連勝2ポイント) sqlで可能でしょうか? 以下のような形で出力できればと考えております。 |player_id|point| | 1| 2| | 2| 1| よろしくお願いいたします。
MySQL単独では難しいと思います。 MySQLを制御する言語(PHP、Javaなど)で制御する方法ではいけませんか? ご確認ください。
関連するQ&A
- 1回のSQLで集計結果順にソートする方法を教えてください
PHP4+MySQLです。 やりたいことがあるのですが、いいSQLが考えつきません。 お知恵を拝借できれば幸いです。 以下のようなテーブルがあるとします。 ID|ITEMid|DATE 1| 232|2009-06-14 2| 156|2009-06-14 3| 156|2009-06-14 4| 232|2009-06-14 5| 232|2009-06-14 6| 567|2009-06-14 これを次のように集計したいのです。 (ITEMidの登場回数順にソートして、実際の回数も出す) 232:3 156:2 567:1 サブクエリの使えない環境で、1回のSQLで集計することはできるでしょうか。できる場合実際のSQL文を教えていただければ幸いです。 テンポラリテーブル使えば自分でもできそうな気がするので、できれば使わない想定でお願いします。
- ベストアンサー
- MySQL
- 集計のSQL文について
SQLでの集計方法について質問です。 Oracle8iを使用しています。 あるテーブルに以下のようなレコードがあります。 ID 回数 値 1 1 100 1 2 200 1 3 300 2 1 150 2 2 550 .... この登録されている値をそのIDごとに、その回数まで回数ごとにサマリーした結果を出力したいのですが どうすればよいでしょうか。 ID 回数 値 1 1 100 ・・・(100) 1 2 300 ・・・(100+200) 1 3 600 ・・・(100+200+300) 2 1 150 ・・・(150) 2 2 700 ・・・(150+550) 宜しくお願いします
- ベストアンサー
- Oracle
- レコード集計のSQLについて
お世話になります。 SQL Serverに関する質問です。 以下の内容を満たすSQLを作成したいのですが、 方法がわからず困っています。 (内容) *************************************************************** ・Aテーブル、Bテーブルには、以下のレコードが格納されています。 [Aテーブル] | key_code | code1 | code2 | code3 | money | person | ← カラム名 ---------------------------------------------- | 001 | 1 | 1 | 1 | 1000 | 10 | ---------------------------------------------- | 001 | 1 | 2 | 1 | 3000 | 10 | ---------------------------------------------- | 001 | 1 | 1 | 1 | 1000 | 10 | ---------------------------------------------- [Bテーブル] | key_code | cd1 | cd2 | cd3 | cd4 | cd5 | ・・・・・ | cd10 | ← カラム名 ------------------------------------------------------------ | 001 | 01 | 02 | 10 | 30 | 51 | ・・・・・ | 90 | ------------------------------------------------------------ | 002 | 01 | 02 | 03 | 10 | 40 | ・・・・・ | 55 | ------------------------------------------------------------ ・Aテーブルの key_code とBテーブルの key_code を関連付けて、 Bテーブルのcd1~cd10に格納されている各コード単位に集計した Aテーブルのmoney及びpersonの値を取得したい。 例えば、 key_code = '000' でAテーブルとBテーブルを関連付けして、 Bテーブルのcd(1~10) = '10' で集計した Aテーブルの money と personの 値を求めたい。 **************************************************************** 初歩的な質問で申し訳ございませんが、 どなたかご教授願えませんでしょうか? よろしくお願いいたします。
- 締切済み
- SQL Server
- XAMPPのMySQLで削除済みレコードが表示される
XAMPPのMySQLで削除済みレコードが表示される XAMPP1.7.3をWinXP Proにて運用しています。 PHPにてselectのSQLを実行したところ、削除済みのレコードが表示されるため困っています。 これまでの経緯は 1.phpMyAdminにてDBとテーブルを作成し、サンプルデータを4件登録 2.PHPからselectで条件なしで全レコードが表示されるのを確認 3.条件をつけてselectし、それぞれの条件にマッチしたレコードが表示されるのを確認 4.phpMyAdminにて1レコードを削除 5.条件をつけてselectし、削除したレコードが表示されるのを発見 6.phpMyAdminのSQLで同じ条件のSQLを実行し、削除レコードが表示されないのを確認 7.PHP側のselect後にDBCloseをしているかの確認 8.phpMyAdminにてテーブルの修復、最適化などを実行 9.MySQLの再起動 以上の操作をしてみましたが、やはりPHPからのSQLの結果に削除されたレコードが表示されてしまいます。 色々なサイトで同じような現象のTipsがないか探しましたが、見つけきれず質問させていただきます。 同じような現象に対しての対応を紹介したサイトや、対処方法をご教授下さい。 よろしくお願いします。
- 締切済み
- MySQL
- php+MySQLでレコードが何行目かを知るには
お世話になります。 php+MySQLの環境でレコードが何行目になるかを 知る方法を教えてください。 まず下記のようなテーブルがあるとします。 | id | name | -------------------- | 1 | 山田 | | 2 | 田中 | | 3 | 中村 | | 5 | 山本 | idはAutoIncrementで振っています。 nameは重複することはありません。 レコードは更新状況により削除されることがあるため、 idは必ずしも連番になっているわけではありません。 このような状況で上のテーブルの「山本」を ORDER BY id ASC で取得する際に「山本は4行目である」 ということがわかる方法を教えてください。 よろしくお願いいたします。
- ベストアンサー
- MySQL
- MySQLへのレコード追加
VB6でMySQL4.1に接続して テーブル"table1"にレコードを追加したいんですけど MySQLには接続できるんですけど、新しいレコードを 追加できません。 エラーメッセージは Unknown column 'ID'in'fieldlist' とでます。 教えてください。 Dim SQL As String Dim ID As Integer Dim name As String Dim cmd As ADODB.Command Set cmd = New ADODB.Command ID = Text1.Text name = Text2.Text SQL = "insert into table1(AID,Aname) values(ID,name) " cmd.ActiveConnection = cn cmd.CommandText = SQL cmd.Execute table1の内容は AID Aname ←フィールド名 ------------- 1 suzuki 2 satou 3 takahasi みたいな感じです。
- ベストアンサー
- Visual Basic
- MySQLで別テーブルを参照し、レコードを消したい
お世話になります。MySQL4のデータベース上に2つのテーブルがあるのですが、 片方のテーブル(a)にあるフィールド(b_id)の値を参照し、もう片方のテーブル(b)のレコードを消していきたいのです。 具体的には以下のようなテーブル(a)とテーブル(b)があります。 TBL: a =========================== id b_id category =========================== 0 1 3 --------------------------- 1 2 1 --------------------------- 2 3 2 --------------------------- 3 4 2 --------------------------- TBL: b =========================== id name price =========================== 0 goodsA 1,000 --------------------------- 1 goodsB 500 --------------------------- 2 goodsC 250 --------------------------- 3 goodsD 2,500 --------------------------- 4 goodsE 1,800 --------------------------- やりたいことは、テーブル(a)の「category」フィールドが「2」以外であれば、 そのレコードの「b_id」にある数値を「id」にもつ、テーブル(b)のレコードを消していきたいのです。 上記の例だと、テーブル(a)のid「0」と「1」がcategoryに「2」以外を持っています。 この2つのレコードのb_idは「1」と「2」ですので、テーブル(b)のid「1」と「2」を消したいと思っています。 SQLについて知識がなく、困っています。どなたかご存知の方がいらっしゃいましたら、お知恵をお貸しください。 よろしくお願いします。
- 締切済み
- MySQL
- MySQLで1つのレコードだけに処理をする方法
MySQL初心者です。よろしくお願いします。 以下のようなテーブルがあったとして、UPDATEでレコード1つだけnumberから特定の数をマイナスしたいのですが、どうもやり方がわかりません。 id | name | number 1 aaa 100 2 bbb 200 3 ccc 300 3 ccc 300 2 bbb 200 例えば、id=2のレコードの中から1つだけ、numberからマイナスするといった処理を行いたい場合、以下のSQL文だとidが2のものすべてから数がマイナスされてしまいます。 UPDATE table SET number = number-50 WHERE id=2; すべてのレコードからマイナスするのではなく、id=2のレコードの中から1つだけマイナスしたいんです。。。 これをid=2の中で1つ目のレコードからだけマイナスする、といったようにうまく1つのレコードからマイナスする方法をご教示いただけるとありがたいです。 つたない文章で恐縮ですが、どうぞよろしくお願いいたします。
- ベストアンサー
- MySQL
- PHPでレコード追加(MYSQL)が出来ません
以下のようにするとうまくいってたのが、 ひとつフィールドを増やすとうまくいきません。 単純なミスだろうと思い、数時間格闘していますが見つかりません。 よろしくご教授お願いいたします。 MYSQL table mem id vacher(10) name vacher(100) pass varcher(8) regdate date PHP $sql = "insert into mem (id , name , pass ,regdate) values ('$id', '$name', '$pass', now())"; ↓↓↓↓↓↓ MYSQL table mem id vacher(10) name vacher(100) pass varcher(8) regdate date kikan varcher(100) PHP $sql = "insert into mem (id , name , pass ,regdate ,kikan) values ('$id', '$name', '$pass', now() ,'$kikan')";
- ベストアンサー
- MySQL
- MySQLでの売上集計
お世話になっております。MySQLのSQLに関する質問ですが、変数で処理しているため、PHPカテゴリで質問させて下さい。 テーブル:slip slip_no member_no sales_date 1 2 2013-06-06 2 1 2013-06-07 3 4 2013-06-08 4 3 2013-06-08 テーブル:sales sales_no sale_slip_no goods_no goods_name request_money receipt_money 1 1 2 キュウリ 5250 NULL 2 1 3 イチゴ 5250 NULL 3 2 6 バナナ 5250 NULL 4 2 5 りんご 5250 NULL 5 2 point NULL NULL 3000 6 3 1 ほうれん草 9450 NULL 7 3 4 しいたけ 2100 NULL 8 4 7 マンゴー 6300 NULL このようなテーブルがあります。(MySQL5) slip_noとsale_slip_noは紐付くデータで、slipテーブルにあるmember_no毎に、 salesテーブルのgoods_noが整数を条件に、request_moneyの1ヵ月前の期間内の request_moneyの合計を算出したいと考えております。 member_no 1を呼出したら、 total 10500 とこのように算出。 以前、http://okwave.jp/qa/q8117105.html こちらで、ご親切に回答頂き、解決したのですが、このテーブルに関連する質問を http://okwave.jp/qa/q8126398.html こちらで伺ったところ、ご親切に正規化を指摘され、テーブルを上記のように分割したという経緯が御座います。 以上のことから、 http://okwave.jp/qa/q8117105.html でアドバイス頂いたSQLを元に、inner join を用いて以下のようなSQLを試していますが、得たい結果を得ることが出来ません。 直接関係ないかもしれませんが、FROMの前にmember_noやsale_slip_no、slip_noなどのカラムを記述するとエラーになったりで、かれこれ3時間もこのSQLで格闘しています。 $sql = "SELECT SUM(request_money) FROM sales INNER JOIN slip ON sales.sale_slip_no = slip.slip_no WHERE slip.member_no = '1' AND sales.goods_no REGEXP '^[0-9]+$' AND slip.sales_date between curdate() - interval 1 month + interval 1 day AND curdate()"; $result = mysql_query($sql); $sum_point = mysql_fetch_assoc($result); $one_month_buy_money = $sum_point['SUM(request_money)']; 最近、質問ばかりで恐縮ですが、アドバイスのほど頂戴出来ればと質問させて頂きました。 お忙しい中恐縮ですが、宜しくお願い申し上げます。 .
- ベストアンサー
- PHP
お礼
yambejp様 集計することができました。 本当にありがとうございました。