SQL初心者質問スレ [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
ちょっと見ただけですけど
recordテーブルを追加するのではなく、
walletテーブルに max_goldという項目を追加すれば良いのでは? user_idごとに1件しか無いのにidが別にあることとかいろいろ気になるけど
まあなんか書いてない理由があるんだろう、、、
どうしても最新状態保つなら単にトリガ書くだけのが早そうだが >>38
正直に言ってくそSQLだわ。
他人があとでみたら、こいつ殺すと思われるレベル。 初心者スレなんだからぼろくそに言うのではなく改善案を提示しないと これは更新が1回でも失敗したらもう最大値が出せなくなるじゃん >>34
walletに時系列データはないのか?
ないと実現出来ないのではないか? だめなSQLのようですね
どこが悪いのかがわからないのでどう改善していいのかもわかりません
具体的に指摘してもらえると助かります
SQL難しいですね
>>39
recordにはユーザーの最大ゴールド以外にもいろいろな記録を持たせようと思っています
>>44
時系列データはありません 開始の残高ファイルと更新データがあれば累計関数使って累計残高viewを作ってその最大値で更新したほうがいいと思う
mysqlでは下記リンク先参照
http://pct.unifas.net/mysql/3712 >>45
疑問なのは、UPDATE文ひとつでやらないと本当にいけないの?
こういう状況がわからない。 >>38のSQLでは、実行時のwalletの値が最大値だったときしか更新されないぞ
履歴保持してないのに全ユーザ一括は無理(全ユーザのwallet更新タイミングが同じでない限り)
walletが時系列や履歴を持たずに、現在値しか保持してないなら
walletの更新時にrecordを更新しないとダメ
で、普通のDBMSなら、こういうのはwalletにトリガ張ってやる
walletを更新するストアドプロシジャ作ってそれでチェックするって方法もあるけど >>47
どういうサイトなのかを説明すべきでしたすみません
ざっくり言うと競馬のようなサイトをやっています
レース終了後に払い戻しとして的中した全ユーザーのwalletのgoldを
ユーザーが賭けた額×オッズ分プラスします
この払い戻しのタイミングでmax_goldを更新したいと思い>>38のようなSQLを考えました
goldが増えるタイミングは払い戻し時のみです
>>48
トリガ、ストアドプロシジャを初めて知りました
調べてみようと思います。ありがとうございます どっちにしてもストアドもトリガも知らないくらいの初心者がDB設計して使い物になるとは思えない
SQL以前にDB設計じゃねえの >>51
> どっちにしてもストアドもトリガも知らないくらいの初心者がDB設計して使い物になるとは思えない
と思ってるような奴の方が使い物になるとは思えんな データベースの勉強をおろそかにしてORMに頼ってたツケが回って来た感があります
データベースについて基本からしっかり勉強し直したいのですが
おすすめの本やサイトを教えていただけないでしょうか >>53
amazonでデータベースで検索し、設計関連の評判の良いものを5冊買え SQLっていうか、DBそのものに関する質問になってしまうんですが。。。
データベースに同じUserID、同じパスワードで複数ログイン出来るってのは一旦資格を与えられたユーザーに
ついてはその権限の範囲なら信用するってことなんですかね。 1ユーザ1コネクションの制限を設けたとしたら、マルチプロセスやマルチスレッドなクライアントが任意のタイミングでコネクションを生成するのに苦労するよ。 そちらの方のプログラミングには疎いんですが、とにかくそういう制限があるとまずいってわけなんですね。^^;
例えば一般ユーザーに開放しているデータベースがあるとして、そこにアクセスするユーザーにいちいちidとパスワード、権限を
与えるのも大変だなとは思ったんですが。 >>57
RDBMSでもOSでも1ユーザー、1セッションというものの方が珍しい。 まあRDBMSによって「ユーザー」というものの定義は異なるけどな ユーザ用(id,パスワード)のテーブルがあった方がいいと思うけど >>57
>例えば一般ユーザーに開放しているデータベースがあるとして、
>そこにアクセスするユーザーにいちいちidとパスワード、権限を
>与えるのも大変だなとは思ったんですが。
一般ユーザーに直接データベースを操作させることは普通しないと思う。
そうではなく、データベースを利用するシステムが、利用ユーザーに提供する
業務用アカウントの話じゃないのかな? ユーザ用って書き方がおかしかった
ユーザを管理するテーブル 最初にテーブルを作成したら、新しいテーブルは必要ないシステムを作っています
この場合、テーブル構造をどう保存するのが正しいやり方ですか?
とりあえずcreate文を保存しています DBのツールでスキーマ保存すると結局CREATE文だけってのもあるしな 例えば名簿のtableがあって、
id name address
という三つのカラムがあります。
idは重複しない番号です。
この時 id で order by して、
idが1000番台の人の最初の100人取り出す。
idが2000番台の人の最初の100人取り出す。
みたいな処理を連続で行う場合、毎回 order by するのは効率悪いと思うのですが、
何か良い方法はありますか?
MySQLです。 >>72
> みたいな処理を連続で行う場合、毎回 order by するのは効率悪いと思うのですが、
indexが使われるなら効率は悪くない >>73>>74
すみません、初心者なのでもう少しヒント下さい。
よく理解できません。 >>75
select * from 名簿 where id >= 1000 order by id limit 100;
とかするんだろうけど、idにindexが付けられてるなら効率は悪くない
これでわからないのならお手上げ 処理が必ず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; >>75
select *
from 名簿
where
id between 1 and 100 or
id between 1000 and 1100 or
id between 2000 and 2100 >>78
そんなのDBMSとオプティマイザの判断次第
カーディナリが十分高ければ、daiのインデックスは使われる可能性が高いだろ
元質問はMySQL指定か。MySQLのオプティマイザでは絶対使わんっていう話なら知らん >>78
idに抜け番がないとはどこにも書いてないけどな そういや、mysqlではsub queryが劇遅だってのは直ったの? >>80
daiのカーディナリティも十分に大きければそのインデックスも使われるだろうけど、
常にそれよりカーディナリティが大きいidのインデックスを使った方がいいに決まってる。
それにそもそもidでソートするわけだし。 SELECT * FROM table
WHERE ...
AND ...
AND ...
AND ...
のようにAND条件をズラズラ並べる場合、
その条件を並べる順番で処理速度は変わりますか? 長文失礼します。
mysqlで
article_infoテーブルに title(記事タイトル),url(記事のurl)を持っています。
blog_infoテーブルには blog_title(ブログのタイトル),blog_url(ブログのtopのurl)を持っています。
やりたいこと:
article_infoで取得した記事のブログのタイトルを一緒に取得したい。
article_info.url は、,blog_urlのレコードのどれかを含んでいます。
例:
blog_title:サンプルブログ
blog_url:http://sample.com/
article_info.url:http://sample.com/article/001
のようになっているので、もし取得したurlがblog_urlに含んでいた場合、対応するblog_titleを共に表示したいと考えています。 ちなみに
SUBSTRING(url,1,LOCATE('/',url,8)) でblog_urlのどれかとマッチするurlが作れることがわかりました。 >>89
普通は検索方法はオプティマイザが判断するから関係ない
定義順に条件書かれてないと複合インデックスが使用できないDBMSがあるとかいう噂は昔聞いたことある
その場合は複合インデックスの定義順に並べるほうが早い可能性が高い
オプティマイザが貧弱で検索順を入れ替えられないDBMSも聞いたことがある
その場合はカーディナルの高い順に検索条件並べろと教えられたことはある
単一テーブルの単純な検索なら、最悪でもそのテーブルのフルスキャン1回ですむから
まあどうでもいいと思うが すみません。下記のかんたんなsqlで取得できました。お騒がせしました。
select
a.title,
a.url,
b.blog_title
from
article_info a,blog_info b >>92
詳しい説明ありがとうございました。
MySQLです。
念のために順番を考慮してAND条件を書いてみます。 >>93
fromでカンマで繋げるのは
INNER JOINの省略形な ふつう直積(CROSS JOIN)だと思うんだが、>>93読んであれ?と思った。
MySQLってそうなのか? すいません、できたと思ってたけどできてませんでした。
しょうがないのでarticle_infoとblog_infoにblog_idカラムを追加して
Inner join で持ってきました。 教えて下さい。
インサートしたカラムに不要な文字[:]がついてしまったのですが、
replaceで毎回取り除いてるとクエリが遅くなるので、すべて更新したいのですが、
update文で出来ますか? mysqlで質問です。
ng_wordテーブルがあります。
テーブルには、wordカラムにキーワードが登録されています。
main_textテーブルのtextカラムの中には
テキストの文章が入っています。
もしmain_textの中にng_wordのwordが含まれていたら、取得したくないのですが、
ロジックを挟まず、sqlだけで取得できますか? WHERE main_text NOT LIKE '%word%' じゃだめだったか? >>103
ワードが1つならそれでも良いかもしれませんが、
複数あるので… このスレ、SQL文書こうとするとエラーになる
どうしたもんかな・・・ Sorry, you have been blocked
You are unable to access 2ch.net
There are several actions that could trigger this block including submitting
a certain word or phrase, a SQL command or malformed data.
SQL文を投稿しようとすると、ハッキング行為とみなされるみたい >>106
まあSQLインジェクション対策なんだろうけどな。 >>107
前の書き込みをよく見ていないけど、テーブルの結合条件もなければ、カラムのテーブル名修飾もなくてわからない。
テーブル間の関係を説明してくれ。
そもそも初めに書いたようにSQLの書き方そのものが悪い。 >>102 に書いてあるだろうに、何が分からないのか分からない 兄弟関係の抽出 と LIMIT、OFFSETに代わるもの (マルチ)
OS: Windows 10 Pro
Access Version: 2016 (2010も使用)
VBA:Excel,Powerpointのみ
VBAでの回答:否
検索キーワード:access SQL 件数 指定
http://www.accessclub.jp/bbs2/0051/beginter16860.html
「No16860.SQLで件数を指定する方法」
と
SELECT [電話番号] FROM [T_児童マスタ] GROUP BY [電話番号] HAVING Count(*)>1
上記2つ等を元に、次のテーブルに適応させようとしていますが、
スマートな文、クエリ(または他の手法)が思いつきません。
どうかアドバイスをお願いいたします。
T_児童マスタ
学級 氏名 電話番号
11 A 1111-11-1111
21 B 2222-22-2222
31 C 1111-11-1111
41 D 2222-22-2222
51 E 1111-11-1111
61 F 3333-33-3333
↓
望む出力結果
学級 氏名 電話番号 兄弟学級1 兄弟氏名1 兄弟学級2 兄弟氏名2 兄弟学級3 兄弟氏名3
11 A 1111-11-1111 31 C 51 E
21 B 2222-22-2222 41 E
31 C 1111-11-1111 11 A 51 E
41 D 2222-22-2222 21 B
51 E 1111-11-1111 11 A 31 C
61 F 3333-33-3333 >>102
直積で結合して、textとwordを引数にとる文字列検索関数があれば、それをWHERE句の絞り込み条件にすればできるな。 >>112
兄弟の数は可変なの?
2固定なら普通にjoinすればいい >>112
こんな感じでいいと思う
SELECT
MM.学級
,MM.氏名
,MM.電話番号
,S1.学級 AS 兄弟学級1
,S1.名前 AS 兄弟氏名1
,S2.学級 AS 兄弟学級2
,S2.名前 AS 兄弟氏名2
,S3.学級 AS 兄弟学級3,
S3.名前 AS 兄弟氏名3
FROM T_児童マスタ AS MM
LEFT JOIN T_児童マスタ AS S1
on S1.電話番号 = MM.電話番号
and S1.学級 <> MM.学級
LEFT JOIN T_児童マスタ AS S2
on S2.電話番号 = MM.電話番号
and S2.学級 <> MM.学級
and S2.学級 <> S1.学級
LEFT JOIN T_児童マスタ AS S3
on S3.電話番号 = MM.電話番号
and S3.学級 <> MM.学級
and S3.学級 <> S1.学級
and S3.学級 <> S2.学級
WHERE nz(S1.学級,999) <= nz(S2.学級,999)
and nz(S2.学級,999) <= nz(S3.学級,999) >>117
ありがとうございます。
これから試してみます。 >>117
少し拡張してみたところ「演算子がありません」とのエラーが
出てしまいます。かなり初歩的な質問になってしまいますが、
問題点をお教えください。宜しくお願いします。
SELECT MM.ID, MM.入学年度, MM.学年, MM.[クラス], MM.[クラス内番号],
MM.姓, MM.名, MM.[せい], MM.[めい],
MM.性別, MM.生年月日, MM.電話番号,
MM.市区町村, MM.町域,MM.番地, MM.号, MM.建物名, MM.郵便番号,
MM.地区・常会, MM.下校コース,
MM.父名, MM.父連絡先, MM.父連絡先電話番号,
MM.母名, MM.母連絡先, MM.母連絡先電話番号,
MM.緊急連絡先1, MM.緊急連絡先2, MM.緊急連絡先3,
S1.学年 AS 在学兄弟姉妹クラス1, S1.名 AS 在学兄弟姉妹名1,
S2.学年 AS 在学兄弟姉妹クラス2, S2.名 AS 在学兄弟姉妹名2,
S3.学年 AS 在学兄弟姉妹クラス3, S3.名 AS 在学兄弟姉妹名3,
MM.PTA役員, MM.備考, MM.除籍
FROM T_児童マスタ AS MM
LEFT JOIN T_児童マスタ AS S1
ON S1.電話番号 = MM.電話番号 ←ここ
AND S1.学年 <> MM.学年 ←ここ
LEFT JOIN T_児童マスタ AS S2
ON S2.電話番号 = MM.電話番号
AND S2.学年 <> MM.学年
AND S2.学年 <> S1.学年
LEFT JOIN T_児童マスタ AS S3
ON S3.電話番号 = MM.電話番号
AND S3.学年 <> MM.学年
AND S3.学年 <> S1.学年
AND S3.学年 <> S2.学年
; >>112 >>117 >>120
こんな感じにしてみましたが、
今度は「JOIN式はサポートされていません。」
と出てしまいます。
SELECT MM.ID, MM.入学年度, MM.学年, MM.[クラス], MM.[クラス内番号],
MM.姓, MM.名, MM.[せい], MM.[めい],
MM.性別, MM.生年月日, MM.電話番号,
MM.市区町村, MM.町域,MM.番地, MM.号, MM.建物名, MM.郵便番号,
MM.地区・常会, MM.下校コース,
MM.父名, MM.父連絡先, MM.父連絡先電話番号,
MM.母名, MM.母連絡先, MM.母連絡先電話番号,
MM.緊急連絡先1, MM.緊急連絡先2, MM.緊急連絡先3,
S1.学年 AS 在学兄弟姉妹クラス1, S1.名 AS 在学兄弟姉妹名1,
S2.学年 AS 在学兄弟姉妹クラス2, S2.名 AS 在学兄弟姉妹名2,
S3.学年 AS 在学兄弟姉妹クラス3, S3.名 AS 在学兄弟姉妹名3,
MM.PTA役員, MM.備考, MM.除籍
FROM
(
(
T_児童マスタ AS MM
LEFT JOIN T_児童マスタ AS S1
ON S1.電話番号 = MM.電話番号
AND S1.学年 <> MM.学年
)
LEFT JOIN T_児童マスタ AS S2
ON S2.電話番号 = MM.電話番号
AND S2.学年 <> MM.学年
AND S2.学年 <> S1.学年
)
LEFT JOIN T_児童マスタ AS S3
ON S3.電話番号 = MM.電話番号
AND S3.学年 <> MM.学年
AND S3.学年 <> S1.学年
AND S3.学年 <> S2.学年
; >>121
accessでは一つのクエリではできないみたい
サブクエリ作って3段重ねで繋げてみて 重複行を見付けたら一行のみ残して他を削除したいのですが、
列名などを指定せずに、
DeleteDuplicateRow テーブル名
みたいなコマンドは無いのでしょうか?
キーは有りません。 その残す1行の指定はどうやって決まる?
基本的にSELECTできるものは消せる >>124
重複しているので、どれを消しても良いと思うのですが。 重複って言うのは、特定のフィールドだけじゃなく
(プライマリーキー以外)全てのフィールドが同じ値になるレコード
って意味で良いのかな? >>126
そうです。
プライマリキーも設定していません。 >>127
a
a
a
これを一行残して消すとか無理だろ >>128
sqlserver ならrownumber関数使えばできる >131
とりあえずMySQLです。SQL SERVERでもやりたいです。 >>132
やはり他の同じ値になるレコードと区別するために
一意のカラムをつけないと削除は無理だと思います
あるいは、>>129さんのやり方でテーブル全体を作り直すのが簡単 一意になるフィールドがあれば(例えばプライマリキーがあれば)、
プライマリキー以外のフィールドでグループ化し、
その上で、一番小さなプライマリキー値のリストを取得、
そのキーリスト以外の全レコードを削除、って感じでできます。 RDBMSで全く同じレコードは扱うの大変だし意味ないので今後のためにキー追加するか
重複したものは登録できないようにしたほうが良さげ 皆さん、いろいろアドバイスありがとうございました。
134さんの方式を試してみます。
重複する行を除去するような操作は普通はやらないのですか? だからその重複させるような事態そのものを発生させないようにしてるんだってば ■ このスレッドは過去ログ倉庫に格納されています