SQL初心者質問スレ [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
スレなかったっけ、、、と探したら無いな、、落ちたんかな 外部の利用者が自由にテーブルを追加できるシステムを sqlite で検討しています。
テーブルが重複しないように利用者番号をテーブル名のプレフィックスにつけようと思います。
もしも、同じようなシーンでの一般的な方法などありましたら教えてください。
よろしくお願いします。 >外部の利用者が自由にテーブルを追加できるシステム
が一般的な使い方とは思えないのに一般的な方法とか... >dbはどう?
この意味がよくわかりません。すみません。
利用者ごとにというのは、少し誤りでした。
正確にはプラグインとして db を操作するモジュールを追加できる仕組みです。
そのモジュールから db に対して create table もできるようにしたいです。
そのときにテーブルの名前の重複を避けたいので、質問させていただきました。 sql というよりはそのモジュールの運用方法の話のようだな 1つのファイルのほうがユーザが使いやすいかと思っています。
もしかしたら sql という枠組みで話す質問ではないのかもしれません。
sql は初心者なので、動的テーブル名などを調べたのですが何か違う気がしました。
sql は歴史もあるし、自分の考えている程度のことはすでに枠組みができているのかと思い質問しました。
sql の枠組みですんなり当てはまるものがないとわかっただけで前進です。
ありがとうございました。 DBの世界でデータをストアすると言いますが、
では読み出す場合は何て言うのでしょうか? >>9
1つのファイルにこだわりすぎていたかもしれません。
DB を分ける案を検討しようと思います。
ありがとうございました。 >>12
5にも礼を言っとけ。
全く同じこと先に言ってる >>13
そういう意味だったんですね
>>5
ありがとうございました。 一旦作ったテーブルを長期間使うのではなく、一日にテーブルのcreateやdropを何十回も繰り返すような使い方は特に問題有りませんか? 取得した順番に数値をインクリメントして表示したいのですが、どういった文法をすればいいですか?
シーケンスとかそういうことではなく、
select
user,num
from
user
みたいなsqlで
userA 1
userB 2
userC 3
のようにnumに取得した順番に数値をインクリメントしたいです。 set @i:=0;
select @i:=@i+1 as rownum,user_id from user;
こういう書き方で自己解決しました。 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 ってエラーで出来ません。コード毎の最新入力日付が指定の日付でないもののみを
出すようにするにはどうすればいいのでしょうか inputなのかinputなのか気になるが、、、
having by 使うケースかなこれ? おっとgroup by の文字省いた時にby残しちゃったhaving ね 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なんて思いつきもしなかったです^^; >>25
テーブル修飾があったり、なかったりしているところがちょっと気持ち悪い。 この場合、codeについては付けないと ambiguous 曖昧と言って怒られてしまうんですが、全部にどちらのテーブルのものなのか
はっきりさせておけってことですか? この例の場合、同じカラムがあるなら、FROM句の最初にあるテーブルのテーブル別名aで修飾するのが一般的。
他人がこのSQLだけを見たとき、この書き方だとどちらのテーブルのカラムか分からない。 mysql5.7を使用しています
ユーザーのゲーム内マネーをwalletテーブルで管理していて
新たにユーザーの最大マネー記録の管理が必要になったので
recordテーブルを新たに作ることにしました
walletテーブル: id, user_id, gold
recordテーブル: id, user_id, max_gold
質問なのですが、walletテーブルのgoldから
recordテーブルのmax_goldを全ユーザー分一括で更新するにはどうしたらいいでしょうか
よろしくお願いします recordには全idすでにある前提?
UPDATE record
SET max_gold = (SELECT MAX(gold) FROM wallet
WHERE record.user_id = wallet.user_id);
とかは? >>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を書けずにいます
教えていただけると嬉しいです
よろしくお願いします >>34
まずはひとつずつ考えて。
段階的に考えていかないと。 あー元がmaxより小さいケースがあんのか、でもl条件一つ追加するだけだよな 自己解決できたみたいです
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;
これでやりたいことはできたと思います
ありがとうございました ■ このスレッドは過去ログ倉庫に格納されています