X



トップページDB@2ch掲示板
1002コメント294KB
SQL初心者質問スレ [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001NAME IS NULL
垢版 |
2016/05/12(木) 05:29:07.61ID:HmbS4CfD
SQL初心者用の質問スレッドです。
0002NAME IS NULL
垢版 |
2016/05/14(土) 12:04:11.91ID:???
2get
teradataの識者いる?
0003NAME IS NULL
垢版 |
2016/05/26(木) 15:09:21.05ID:???
スレなかったっけ、、、と探したら無いな、、落ちたんかな
0004NAME IS NULL
垢版 |
2016/06/18(土) 19:48:26.11ID:wQWiAJ0q
外部の利用者が自由にテーブルを追加できるシステムを sqlite で検討しています。
テーブルが重複しないように利用者番号をテーブル名のプレフィックスにつけようと思います。

もしも、同じようなシーンでの一般的な方法などありましたら教えてください。
よろしくお願いします。
0006NAME IS NULL
垢版 |
2016/06/18(土) 22:19:58.66ID:???
>外部の利用者が自由にテーブルを追加できるシステム
が一般的な使い方とは思えないのに一般的な方法とか...
0007NAME IS NULL
垢版 |
2016/06/19(日) 04:42:21.27ID:???
>dbはどう?
この意味がよくわかりません。すみません。

利用者ごとにというのは、少し誤りでした。
正確にはプラグインとして db を操作するモジュールを追加できる仕組みです。
そのモジュールから db に対して create table もできるようにしたいです。
そのときにテーブルの名前の重複を避けたいので、質問させていただきました。
0008NAME IS NULL
垢版 |
2016/06/19(日) 09:41:12.88ID:???
sql というよりはそのモジュールの運用方法の話のようだな
0009NAME IS NULL
垢版 |
2016/06/19(日) 10:24:19.80ID:???
無謀な気が
ユーザーごとにDB分けちゃダメなん?
0010NAME IS NULL
垢版 |
2016/06/19(日) 11:22:35.41ID:???
1つのファイルのほうがユーザが使いやすいかと思っています。

もしかしたら sql という枠組みで話す質問ではないのかもしれません。
sql は初心者なので、動的テーブル名などを調べたのですが何か違う気がしました。
sql は歴史もあるし、自分の考えている程度のことはすでに枠組みができているのかと思い質問しました。

sql の枠組みですんなり当てはまるものがないとわかっただけで前進です。
ありがとうございました。
0011NAME IS NULL
垢版 |
2016/06/19(日) 11:31:36.67ID:???
DBの世界でデータをストアすると言いますが、
では読み出す場合は何て言うのでしょうか?
0012NAME IS NULL
垢版 |
2016/06/19(日) 11:35:49.20ID:???
>>9
1つのファイルにこだわりすぎていたかもしれません。
DB を分ける案を検討しようと思います。
ありがとうございました。
0013NAME IS NULL
垢版 |
2016/06/19(日) 11:58:16.35ID:???
>>12
5にも礼を言っとけ。
全く同じこと先に言ってる
0014NAME IS NULL
垢版 |
2016/06/19(日) 13:52:20.11ID:???
>>13
そういう意味だったんですね

>>5
ありがとうございました。
0015NAME IS NULL
垢版 |
2016/06/21(火) 16:53:37.04ID:???
一旦作ったテーブルを長期間使うのではなく、一日にテーブルのcreateやdropを何十回も繰り返すような使い方は特に問題有りませんか?
0018NAME IS NULL
垢版 |
2016/07/09(土) 17:51:20.85ID:uRuLwqJe
取得した順番に数値をインクリメントして表示したいのですが、どういった文法をすればいいですか?
シーケンスとかそういうことではなく、

select
user,num
from
user

みたいなsqlで
userA 1
userB 2
userC 3

のようにnumに取得した順番に数値をインクリメントしたいです。
0019NAME IS NULL
垢版 |
2016/07/09(土) 17:59:50.73ID:uRuLwqJe
set @i:=0;
select @i:=@i+1 as rownum,user_id from user;

こういう書き方で自己解決しました。
0020NAME IS NULL
垢版 |
2016/07/21(木) 20:04:08.07ID:W6OLWaxQ
質問するときはRDBの名前くらいは書きましょう。
0021NAME IS NULL
垢版 |
2016/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 NULL
垢版 |
2016/08/07(日) 10:36:30.57ID:???
inputなのかinputなのか気になるが、、、
having by 使うケースかなこれ?
0023NAME IS NULL
垢版 |
2016/08/07(日) 10:37:21.81ID:???
おっとgroup by の文字省いた時にby残しちゃったhaving ね
002421
垢版 |
2016/08/07(日) 16:10:17.24ID:???
あぁinoutになってるw inputです
002521
垢版 |
2016/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なんて思いつきもしなかったです^^;
0027NAME IS NULL
垢版 |
2016/08/07(日) 16:59:37.21ID:mqpBG9Ui
>>25
テーブル修飾があったり、なかったりしているところがちょっと気持ち悪い。
002825
垢版 |
2016/08/07(日) 18:45:08.20ID:???
この場合、codeについては付けないと ambiguous 曖昧と言って怒られてしまうんですが、全部にどちらのテーブルのものなのか
はっきりさせておけってことですか?
003025
垢版 |
2016/08/07(日) 20:34:00.34ID:???
努力します^^;
0031NAME IS NULL
垢版 |
2016/08/07(日) 20:46:40.28ID:mqpBG9Ui
この例の場合、同じカラムがあるなら、FROM句の最初にあるテーブルのテーブル別名aで修飾するのが一般的。

他人がこのSQLだけを見たとき、この書き方だとどちらのテーブルのカラムか分からない。
0032NAME IS NULL
垢版 |
2016/08/21(日) 09:41:45.55ID:???
mysql5.7を使用しています
ユーザーのゲーム内マネーをwalletテーブルで管理していて
新たにユーザーの最大マネー記録の管理が必要になったので
recordテーブルを新たに作ることにしました

walletテーブル: id, user_id, gold
recordテーブル: id, user_id, max_gold

質問なのですが、walletテーブルのgoldから
recordテーブルのmax_goldを全ユーザー分一括で更新するにはどうしたらいいでしょうか
よろしくお願いします
0033NAME IS NULL
垢版 |
2016/08/21(日) 14:33:49.32ID:???
recordには全idすでにある前提?

UPDATE record
SET max_gold = (SELECT MAX(gold) FROM wallet
WHERE record.user_id = wallet.user_id);

とかは?
003432
垢版 |
2016/08/22(月) 01:44:39.00ID:???
>>33
レスありがとうございます
説明が不足していてすみません
userテーブルとwalletテーブルは1対1になっています
userテーブルとrecordテーブルも1対1です
全user分のwalletとrecordが存在します
walletテーブルのgoldは増減します
recordテーブルのmax_goldは過去最高goldです
あるタイミングで複数walletに一斉にgoldがプラスされます
そのときにwalletのgoldがrecordのmax_goldより大きければmax_goldを更新したいです
自分なりに調べてupdateとjoinを使うのだろうということはわかりましたがSQLを書けずにいます
教えていただけると嬉しいです
よろしくお願いします
0035NAME IS NULL
垢版 |
2016/08/22(月) 01:49:54.86ID:nVybO4PH
>>34
まずはひとつずつ考えて。

段階的に考えていかないと。
0036NAME IS NULL
垢版 |
2016/08/22(月) 04:14:30.36ID:???
別にその条件でも>>33でいけるだろ
0037NAME IS NULL
垢版 |
2016/08/22(月) 04:17:24.95ID:???
あー元がmaxより小さいケースがあんのか、でもl条件一つ追加するだけだよな
003832
垢版 |
2016/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 NULL
垢版 |
2016/08/22(月) 10:41:57.37ID:???
ちょっと見ただけですけど
recordテーブルを追加するのではなく、
walletテーブルに max_goldという項目を追加すれば良いのでは?
0040NAME IS NULL
垢版 |
2016/08/22(月) 10:57:44.22ID:???
user_idごとに1件しか無いのにidが別にあることとかいろいろ気になるけど
まあなんか書いてない理由があるんだろう、、、

どうしても最新状態保つなら単にトリガ書くだけのが早そうだが
0041NAME IS NULL
垢版 |
2016/08/22(月) 13:08:23.88ID:nVybO4PH
>>38
正直に言ってくそSQLだわ。

他人があとでみたら、こいつ殺すと思われるレベル。
0042NAME IS NULL
垢版 |
2016/08/22(月) 13:40:23.90ID:???
初心者スレなんだからぼろくそに言うのではなく改善案を提示しないと
0043NAME IS NULL
垢版 |
2016/08/22(月) 13:59:03.07ID:???
これは更新が1回でも失敗したらもう最大値が出せなくなるじゃん
0044NAME IS NULL
垢版 |
2016/08/22(月) 18:58:47.51ID:???
>>34
walletに時系列データはないのか?
ないと実現出来ないのではないか?
004532
垢版 |
2016/08/22(月) 20:10:31.73ID:???
だめなSQLのようですね
どこが悪いのかがわからないのでどう改善していいのかもわかりません
具体的に指摘してもらえると助かります
SQL難しいですね

>>39
recordにはユーザーの最大ゴールド以外にもいろいろな記録を持たせようと思っています

>>44
時系列データはありません
0046NAME IS NULL
垢版 |
2016/08/22(月) 22:48:38.43ID:???
開始の残高ファイルと更新データがあれば累計関数使って累計残高viewを作ってその最大値で更新したほうがいいと思う
mysqlでは下記リンク先参照
http://pct.unifas.net/mysql/3712
0047NAME IS NULL
垢版 |
2016/08/22(月) 23:24:46.87ID:nVybO4PH
>>45
疑問なのは、UPDATE文ひとつでやらないと本当にいけないの?

こういう状況がわからない。
0048NAME IS NULL
垢版 |
2016/08/23(火) 03:22:31.82ID:???
>>38のSQLでは、実行時のwalletの値が最大値だったときしか更新されないぞ
履歴保持してないのに全ユーザ一括は無理(全ユーザのwallet更新タイミングが同じでない限り)

walletが時系列や履歴を持たずに、現在値しか保持してないなら
walletの更新時にrecordを更新しないとダメ

で、普通のDBMSなら、こういうのはwalletにトリガ張ってやる
walletを更新するストアドプロシジャ作ってそれでチェックするって方法もあるけど
004932
垢版 |
2016/08/23(火) 12:32:35.01ID:???
>>47
どういうサイトなのかを説明すべきでしたすみません
ざっくり言うと競馬のようなサイトをやっています
レース終了後に払い戻しとして的中した全ユーザーのwalletのgoldを
ユーザーが賭けた額×オッズ分プラスします
この払い戻しのタイミングでmax_goldを更新したいと思い>>38のようなSQLを考えました
goldが増えるタイミングは払い戻し時のみです

>>48
トリガ、ストアドプロシジャを初めて知りました
調べてみようと思います。ありがとうございます
0050NAME IS NULL
垢版 |
2016/08/23(火) 12:41:04.01ID:???
>>40 でトリガって書いてるのになw
0051NAME IS NULL
垢版 |
2016/08/23(火) 12:42:04.90ID:???
どっちにしてもストアドもトリガも知らないくらいの初心者がDB設計して使い物になるとは思えない
SQL以前にDB設計じゃねえの
0052NAME IS NULL
垢版 |
2016/08/23(火) 12:55:29.40ID:???
>>51
> どっちにしてもストアドもトリガも知らないくらいの初心者がDB設計して使い物になるとは思えない
と思ってるような奴の方が使い物になるとは思えんな
005332
垢版 |
2016/08/23(火) 13:06:07.75ID:???
データベースの勉強をおろそかにしてORMに頼ってたツケが回って来た感があります
データベースについて基本からしっかり勉強し直したいのですが
おすすめの本やサイトを教えていただけないでしょうか
0054NAME IS NULL
垢版 |
2016/08/23(火) 14:43:56.01ID:???
>>53
amazonでデータベースで検索し、設計関連の評判の良いものを5冊買え
0055NAME IS NULL
垢版 |
2016/09/01(木) 16:46:33.47ID:???
SQLっていうか、DBそのものに関する質問になってしまうんですが。。。

データベースに同じUserID、同じパスワードで複数ログイン出来るってのは一旦資格を与えられたユーザーに
ついてはその権限の範囲なら信用するってことなんですかね。
0056NAME IS NULL
垢版 |
2016/09/01(木) 17:48:15.50ID:???
1ユーザ1コネクションの制限を設けたとしたら、マルチプロセスやマルチスレッドなクライアントが任意のタイミングでコネクションを生成するのに苦労するよ。
005755
垢版 |
2016/09/01(木) 18:40:00.10ID:???
そちらの方のプログラミングには疎いんですが、とにかくそういう制限があるとまずいってわけなんですね。^^;
例えば一般ユーザーに開放しているデータベースがあるとして、そこにアクセスするユーザーにいちいちidとパスワード、権限を
与えるのも大変だなとは思ったんですが。
0058NAME IS NULL
垢版 |
2016/09/01(木) 19:02:23.73ID:???
何に関しては疎くないの?
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況