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は使われない 0079NAME IS NULL2016/09/16(金) 17:12:26.30ID:???>>75 select * from 名簿 where id between 1 and 100 or id between 1000 and 1100 or id between 2000 and 2100 0080NAME IS NULL2016/09/16(金) 17:17:10.22ID:???>>78 そんなのDBMSとオプティマイザの判断次第 カーディナリが十分高ければ、daiのインデックスは使われる可能性が高いだろ
元質問はMySQL指定か。MySQLのオプティマイザでは絶対使わんっていう話なら知らん 0081NAME IS NULL2016/09/16(金) 17:19:10.66ID:???>>78 idに抜け番がないとはどこにも書いてないけどな 0082NAME IS NULL2016/09/16(金) 17:39:29.68ID:???>>80 MySQLのこと知らんなら黙っとけよ 0083NAME IS NULL2016/09/16(金) 17:42:18.69ID:???>>82 まいしーくぇる 0084NAME IS NULL2016/09/16(金) 18:05:34.85ID:??? mysqlはクソだからしかたがない。 0085NAME IS NULL2016/09/16(金) 18:10:25.81ID:???>>84 まいしーける 0086NAME IS NULL2016/09/16(金) 18:25:35.23ID:??? そういや、mysqlではsub queryが劇遅だってのは直ったの? 0087NAME IS NULL2016/09/16(金) 21:39:39.26ID:???>>80 daiのカーディナリティも十分に大きければそのインデックスも使われるだろうけど、 常にそれよりカーディナリティが大きいidのインデックスを使った方がいいに決まってる。 それにそもそもidでソートするわけだし。 0088NAME IS NULL2016/09/17(土) 02:16:52.23ID:??? ありがとうございました indexを試してみます 0089NAME IS NULL2016/09/22(木) 11:38:01.04ID:??? SELECT * FROM table WHERE ... AND ... AND ... AND ... のようにAND条件をズラズラ並べる場合、 その条件を並べる順番で処理速度は変わりますか? 0090NAME IS NULL2016/09/22(木) 12:44:02.41ID:??? 長文失礼します。 mysqlで article_infoテーブルに title(記事タイトル),url(記事のurl)を持っています。 blog_infoテーブルには blog_title(ブログのタイトル),blog_url(ブログのtopのurl)を持っています。
オプティマイザが貧弱で検索順を入れ替えられないDBMSも聞いたことがある その場合はカーディナルの高い順に検索条件並べろと教えられたことはある 単一テーブルの単純な検索なら、最悪でもそのテーブルのフルスキャン1回ですむから まあどうでもいいと思うが 0093902016/09/22(木) 13:33:17.23ID:??? すみません。下記のかんたんなsqlで取得できました。お騒がせしました。 select a.title, a.url, b.blog_title from article_info a,blog_info b 0094NAME IS NULL2016/09/22(木) 20:16:59.13ID:???>>92 詳しい説明ありがとうございました。 MySQLです。 念のために順番を考慮してAND条件を書いてみます。 0095NAME IS NULL2016/09/22(木) 23:39:21.90ID:???>>93 fromでカンマで繋げるのは INNER JOINの省略形な 0096NAME IS NULL2016/09/22(木) 23:45:57.18ID:??? cross joinだろ 0097NAME IS NULL2016/09/22(木) 23:53:56.92ID:??? ふつう直積(CROSS JOIN)だと思うんだが、>>93読んであれ?と思った。 MySQLってそうなのか? 0098NAME IS NULL2016/09/23(金) 00:03:00.24ID:??? whereでなんかしてなければ直積だな 0099932016/09/23(金) 02:59:28.95ID:??? すいません、できたと思ってたけどできてませんでした。 しょうがないのでarticle_infoとblog_infoにblog_idカラムを追加して Inner join で持ってきました。 0100NAME IS NULL2016/09/24(土) 09:51:02.05ID:UI+2ILvZ 教えて下さい。 インサートしたカラムに不要な文字[:]がついてしまったのですが、 replaceで毎回取り除いてるとクエリが遅くなるので、すべて更新したいのですが、 update文で出来ますか? 01011002016/09/24(土) 09:57:30.44ID:UI+2ILvZ できました。忘れてください。 0102NAME IS NULL2016/10/05(水) 22:12:12.17ID:??? mysqlで質問です。 ng_wordテーブルがあります。 テーブルには、wordカラムにキーワードが登録されています。
main_textテーブルのtextカラムの中には テキストの文章が入っています。
もしmain_textの中にng_wordのwordが含まれていたら、取得したくないのですが、 ロジックを挟まず、sqlだけで取得できますか? 0103NAME IS NULL2016/10/05(水) 22:26:56.73ID:??? WHERE main_text NOT LIKE '%word%' じゃだめだったか? 01041022016/10/05(水) 22:40:45.63ID:???>>103 ワードが1つならそれでも良いかもしれませんが、 複数あるので… 0105NAME IS NULL2016/10/06(木) 00:04:56.18ID:??? このスレ、SQL文書こうとするとエラーになる どうしたもんかな・・・ 0106NAME IS NULL2016/10/06(木) 00:19:48.71ID:??? 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.
学級 氏名 電話番号 兄弟学級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 0113NAME IS NULL2016/10/17(月) 01:58:23.01ID:ee1NFGBS>>102 直積で結合して、textとwordを引数にとる文字列検索関数があれば、それをWHERE句の絞り込み条件にすればできるな。 0114NAME IS NULL2016/10/17(月) 07:12:12.69ID:???>>112 兄弟の数は可変なの? 2固定なら普通にjoinすればいい 0115NAME IS NULL2016/10/17(月) 07:13:39.77ID:???>>114 よくみたら2じゃなくて3か 0116NAME IS NULL2016/10/17(月) 07:25:17.32ID:??? 堂々とマルチと宣言すれば文句言われない!キリッ 0117NAME IS NULL2016/10/17(月) 07:35:53.31ID:w90R1vLK>>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) 0118NAME IS NULL2016/10/17(月) 13:02:38.65ID:???>>105 全角 0119NAME IS NULL2016/10/17(月) 18:24:29.94ID:3tZ2amHg>>117 ありがとうございます。 これから試してみます。 0120NAME IS NULL2016/10/17(月) 19:50:25.76ID:3tZ2amHg>>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.学年 ; 0121NAME IS NULL2016/10/17(月) 20:30:12.67ID:3tZ2amHg>>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.学年 ; 0122NAME IS NULL2016/10/18(火) 00:34:12.50ID:???>>121 accessでは一つのクエリではできないみたい サブクエリ作って3段重ねで繋げてみて 0123NAME IS NULL2016/10/18(火) 03:32:30.90ID:??? 重複行を見付けたら一行のみ残して他を削除したいのですが、 列名などを指定せずに、 DeleteDuplicateRow テーブル名 みたいなコマンドは無いのでしょうか? キーは有りません。 0124NAME IS NULL2016/10/18(火) 11:21:45.19ID:??? その残す1行の指定はどうやって決まる? 基本的にSELECTできるものは消せる 0125NAME IS NULL2016/10/18(火) 11:44:05.07ID:???>>124 重複しているので、どれを消しても良いと思うのですが。 0126NAME IS NULL2016/10/18(火) 11:49:15.77ID:??? 重複って言うのは、特定のフィールドだけじゃなく (プライマリーキー以外)全てのフィールドが同じ値になるレコード って意味で良いのかな? 0127NAME IS NULL2016/10/18(火) 11:52:11.08ID:???>>126 そうです。 プライマリキーも設定していません。 0128NAME IS NULL2016/10/18(火) 12:29:42.88ID:???>>127 a a a これを一行残して消すとか無理だろ 0129NAME IS NULL2016/10/18(火) 12:34:08.13ID:??? distinctで作り直す 0130NAME IS NULL2016/10/18(火) 12:36:25.12ID:???>>128 a 0131NAME IS NULL2016/10/18(火) 12:36:59.34ID:???>>128 sqlserver ならrownumber関数使えばできる 0132NAME IS NULL2016/10/18(火) 12:39:09.00ID:??? >131 とりあえずMySQLです。SQL SERVERでもやりたいです。 0133NAME IS NULL2016/10/18(火) 14:01:40.70ID:???>>132 やはり他の同じ値になるレコードと区別するために 一意のカラムをつけないと削除は無理だと思います あるいは、>>129さんのやり方でテーブル全体を作り直すのが簡単 0134NAME IS NULL2016/10/18(火) 15:17:32.19ID:??? 一意になるフィールドがあれば(例えばプライマリキーがあれば)、 プライマリキー以外のフィールドでグループ化し、 その上で、一番小さなプライマリキー値のリストを取得、 そのキーリスト以外の全レコードを削除、って感じでできます。 0135NAME IS NULL2016/10/18(火) 17:24:15.67ID:??? RDBMSで全く同じレコードは扱うの大変だし意味ないので今後のためにキー追加するか 重複したものは登録できないようにしたほうが良さげ 0136NAME IS NULL2016/10/19(水) 01:24:02.04ID:wlxzgloU 皆さん、いろいろアドバイスありがとうございました。 134さんの方式を試してみます。 重複する行を除去するような操作は普通はやらないのですか? 0137NAME IS NULL2016/10/19(水) 06:20:22.91ID:??? だからその重複させるような事態そのものを発生させないようにしてるんだってば 0138NAME IS NULL2016/10/19(水) 07:09:29.07ID:???>>136 そのためのプライマリキーです