sql の枠組みですんなり当てはまるものがないとわかっただけで前進です。 ありがとうございました。 0011NAME IS NULL2016/06/19(日) 11:31:36.67ID:??? DBの世界でデータをストアすると言いますが、 では読み出す場合は何て言うのでしょうか? 0012NAME IS NULL2016/06/19(日) 11:35:49.20ID:???>>9 1つのファイルにこだわりすぎていたかもしれません。 DB を分ける案を検討しようと思います。 ありがとうございました。 0013NAME IS NULL2016/06/19(日) 11:58:16.35ID:???>>12 5にも礼を言っとけ。 全く同じこと先に言ってる 0014NAME IS NULL2016/06/19(日) 13:52:20.11ID:???>>13 そういう意味だったんですね
>>5 ありがとうございました。 0015NAME IS NULL2016/06/21(火) 16:53:37.04ID:??? 一旦作ったテーブルを長期間使うのではなく、一日にテーブルのcreateやdropを何十回も繰り返すような使い方は特に問題有りませんか? 0016NAME IS NULL2016/06/21(火) 18:07:42.86ID:??? 要件次第 0017NAME IS NULL2016/06/21(火) 18:32:30.12ID:???>>15 大丈ー夫 0018NAME IS NULL2016/07/09(土) 17:51:20.85ID:uRuLwqJe 取得した順番に数値をインクリメントして表示したいのですが、どういった文法をすればいいですか? シーケンスとかそういうことではなく、
select user,num from user
みたいなsqlで userA 1 userB 2 userC 3
のようにnumに取得した順番に数値をインクリメントしたいです。 0019NAME IS NULL2016/07/09(土) 17:59:50.73ID:uRuLwqJe set @i:=0; select @i:=@i+1 as rownum,user_id from user;
こういう書き方で自己解決しました。 0020NAME IS NULL2016/07/21(木) 20:04:08.07ID:W6OLWaxQ 質問するときはRDBの名前くらいは書きましょう。 0021NAME IS NULL2016/08/07(日) 07:38:31.22ID:??? mysql 5.6.20 です
daily_tblからcode毎の最新入力日付を得るのに select a.code,code_name ,max(input_date) as saishin from daily_tbl a inner join master b on a.code = b.code group by code order by code; で出せたんですが、 今度はその日付が指定の日付でないもののみを出そうとして select a.code,code_name ,max(input_date) as saishin from daily_tbl a inner join master b on a.code = b.code where max(inout_date) != '2016-08-05' group by code order by code; とすると、Invalid use of group function ってエラーで出来ません。コード毎の最新入力日付が指定の日付でないもののみを 出すようにするにはどうすればいいのでしょうか 0022NAME IS NULL2016/08/07(日) 10:36:30.57ID:??? inputなのかinputなのか気になるが、、、 having by 使うケースかなこれ? 0023NAME IS NULL2016/08/07(日) 10:37:21.81ID:??? おっとgroup by の文字省いた時にby残しちゃったhaving ね 0024212016/08/07(日) 16:10:17.24ID:??? あぁinoutになってるw inputです 0025212016/08/07(日) 16:17:17.84ID:??? select a.code,code_name ,max(input_date) as saishin from daily_tbl a inner join master b on a.code = b.code group by code having max(input_date) != '2016-08-05' order by code;
で出てきました。実際に使う時に全然havingなんて思いつきもしなかったです^^; 0026NAME IS NULL2016/08/07(日) 16:18:21.01ID:???>>22 ありがとうございます 0027NAME IS NULL2016/08/07(日) 16:59:37.21ID:mqpBG9Ui>>25 テーブル修飾があったり、なかったりしているところがちょっと気持ち悪い。 0028252016/08/07(日) 18:45:08.20ID:??? この場合、codeについては付けないと ambiguous 曖昧と言って怒られてしまうんですが、全部にどちらのテーブルのものなのか はっきりさせておけってことですか? 0029NAME IS NULL2016/08/07(日) 19:19:26.47ID:???>>28 はい 0030252016/08/07(日) 20:34:00.34ID:??? 努力します^^; 0031NAME IS NULL2016/08/07(日) 20:46:40.28ID:mqpBG9Ui この例の場合、同じカラムがあるなら、FROM句の最初にあるテーブルのテーブル別名aで修飾するのが一般的。
他人がこのSQLだけを見たとき、この書き方だとどちらのテーブルのカラムか分からない。 0032NAME IS NULL2016/08/21(日) 09:41:45.55ID:??? mysql5.7を使用しています ユーザーのゲーム内マネーをwalletテーブルで管理していて 新たにユーザーの最大マネー記録の管理が必要になったので recordテーブルを新たに作ることにしました
段階的に考えていかないと。 0036NAME IS NULL2016/08/22(月) 04:14:30.36ID:??? 別にその条件でも>>33でいけるだろ 0037NAME IS NULL2016/08/22(月) 04:17:24.95ID:??? あー元がmaxより小さいケースがあんのか、でもl条件一つ追加するだけだよな 0038322016/08/22(月) 10:24:05.45ID:??? 自己解決できたみたいです
update record left join wallet on record.user_id = wallet.user_id set record.max_gold = if(wallet.gold > record.max_gold, wallet.gold, record.max_gold) where record.user_id = wallet.user_id;
これでやりたいことはできたと思います ありがとうございました 0039NAME IS NULL2016/08/22(月) 10:41:57.37ID:??? ちょっと見ただけですけど recordテーブルを追加するのではなく、 walletテーブルに max_goldという項目を追加すれば良いのでは? 0040NAME IS NULL2016/08/22(月) 10:57:44.22ID:??? user_idごとに1件しか無いのにidが別にあることとかいろいろ気になるけど まあなんか書いてない理由があるんだろう、、、
どうしても最新状態保つなら単にトリガ書くだけのが早そうだが 0041NAME IS NULL2016/08/22(月) 13:08:23.88ID:nVybO4PH>>38 正直に言ってくそSQLだわ。
他人があとでみたら、こいつ殺すと思われるレベル。 0042NAME IS NULL2016/08/22(月) 13:40:23.90ID:??? 初心者スレなんだからぼろくそに言うのではなく改善案を提示しないと 0043NAME IS NULL2016/08/22(月) 13:59:03.07ID:??? これは更新が1回でも失敗したらもう最大値が出せなくなるじゃん 0044NAME IS NULL2016/08/22(月) 18:58:47.51ID:???>>34 walletに時系列データはないのか? ないと実現出来ないのではないか? 0045322016/08/22(月) 20:10:31.73ID:??? だめなSQLのようですね どこが悪いのかがわからないのでどう改善していいのかもわかりません 具体的に指摘してもらえると助かります SQL難しいですね
>>48 トリガ、ストアドプロシジャを初めて知りました 調べてみようと思います。ありがとうございます 0050NAME IS NULL2016/08/23(火) 12:41:04.01ID:???>>40 でトリガって書いてるのになw 0051NAME IS NULL2016/08/23(火) 12:42:04.90ID:??? どっちにしてもストアドもトリガも知らないくらいの初心者がDB設計して使い物になるとは思えない SQL以前にDB設計じゃねえの 0052NAME IS NULL2016/08/23(火) 12:55:29.40ID:???>>51 > どっちにしてもストアドもトリガも知らないくらいの初心者がDB設計して使い物になるとは思えない と思ってるような奴の方が使い物になるとは思えんな 0053322016/08/23(火) 13:06:07.75ID:??? データベースの勉強をおろそかにしてORMに頼ってたツケが回って来た感があります データベースについて基本からしっかり勉強し直したいのですが おすすめの本やサイトを教えていただけないでしょうか 0054NAME IS NULL2016/08/23(火) 14:43:56.01ID:???>>53 amazonでデータベースで検索し、設計関連の評判の良いものを5冊買え 0055NAME IS NULL2016/09/01(木) 16:46:33.47ID:??? SQLっていうか、DBそのものに関する質問になってしまうんですが。。。
データベースに同じUserID、同じパスワードで複数ログイン出来るってのは一旦資格を与えられたユーザーに ついてはその権限の範囲なら信用するってことなんですかね。 0056NAME IS NULL2016/09/01(木) 17:48:15.50ID:??? 1ユーザ1コネクションの制限を設けたとしたら、マルチプロセスやマルチスレッドなクライアントが任意のタイミングでコネクションを生成するのに苦労するよ。 0057552016/09/01(木) 18:40:00.10ID:??? そちらの方のプログラミングには疎いんですが、とにかくそういう制限があるとまずいってわけなんですね。^^; 例えば一般ユーザーに開放しているデータベースがあるとして、そこにアクセスするユーザーにいちいちidとパスワード、権限を 与えるのも大変だなとは思ったんですが。 0058NAME IS NULL2016/09/01(木) 19:02:23.73ID:??? 何に関しては疎くないの? 0059NAME IS NULL2016/09/01(木) 20:30:50.75ID:???>>58 バカ発見 0060NAME IS NULL2016/09/01(木) 21:43:12.28ID:???>>59 回答してあげなよ ^^ 0061NAME IS NULL2016/09/01(木) 22:57:57.54ID:???>>57 なんかいろいろ勘違いしてる 0062NAME IS NULL2016/09/02(金) 02:24:24.57ID:RT8+OUHE>>57 RDBMSでもOSでも1ユーザー、1セッションというものの方が珍しい。 0063NAME IS NULL2016/09/02(金) 02:39:07.81ID:??? まあRDBMSによって「ユーザー」というものの定義は異なるけどな 0064NAME IS NULL2016/09/04(日) 21:42:59.71ID:??? トランザクションとかの話? 0065NAME IS NULL2016/09/04(日) 21:58:50.03ID:??? ユーザ用(id,パスワード)のテーブルがあった方がいいと思うけど 0066NAME IS NULL2016/09/04(日) 22:33:29.15ID:???>>57 >例えば一般ユーザーに開放しているデータベースがあるとして、 >そこにアクセスするユーザーにいちいちidとパスワード、権限を >与えるのも大変だなとは思ったんですが。
一般ユーザーに直接データベースを操作させることは普通しないと思う。
そうではなく、データベースを利用するシステムが、利用ユーザーに提供する 業務用アカウントの話じゃないのかな? 0067NAME IS NULL2016/09/04(日) 22:40:44.03ID:??? ユーザ用って書き方がおかしかった ユーザを管理するテーブル 0068NAME IS NULL2016/09/05(月) 16:09:42.99ID:??? 最初にテーブルを作成したら、新しいテーブルは必要ないシステムを作っています この場合、テーブル構造をどう保存するのが正しいやり方ですか? とりあえずcreate文を保存しています 0069NAME IS NULL2016/09/05(月) 16:42:31.07ID:???>>68 それでいいよ 0070NAME IS NULL2016/09/05(月) 16:46:05.98ID:??? DBのツールでスキーマ保存すると結局CREATE文だけってのもあるしな 0071NAME IS NULL2016/09/05(月) 16:53:22.93ID:???>>69 ありがとうございます 0072NAME IS NULL2016/09/16(金) 14:02:36.57ID:??? 例えば名簿のtableがあって、 id name address という三つのカラムがあります。 idは重複しない番号です。 この時 id で order by して、 idが1000番台の人の最初の100人取り出す。 idが2000番台の人の最初の100人取り出す。 みたいな処理を連続で行う場合、毎回 order by するのは効率悪いと思うのですが、 何か良い方法はありますか? MySQLです。 0073NAME IS NULL2016/09/16(金) 15:12:58.45ID:???>>72 between 0074NAME IS NULL2016/09/16(金) 15:37:16.31ID:???>>72 > みたいな処理を連続で行う場合、毎回 order by するのは効率悪いと思うのですが、 indexが使われるなら効率は悪くない 0075NAME IS NULL2016/09/16(金) 15:46:47.88ID:???>>73>>74 すみません、初心者なのでもう少しヒント下さい。 よく理解できません。 0076NAME IS NULL2016/09/16(金) 15:50:26.47ID:???>>75 select * from 名簿 where id >= 1000 order by id limit 100; とかするんだろうけど、idにindexが付けられてるなら効率は悪くない これでわからないのならお手上げ 0077NAME IS NULL2016/09/16(金) 15:57:39.07ID:??? 処理が必ず1000番台ごとにするなら もう一つ項目daiを追加して、indexを張っておき id 1000〜1999 には 1 をセット id 2000〜2999 には 2 をセット id 3000〜3999 には 3 をセット というのは? select * from 名簿 where dai=1 order by id limit 100; 0078NAME IS NULL2016/09/16(金) 16:32:17.70ID:???>>77 それだとindexは使われない