1read 100read
2012年1月2期データベース3: 【MySQL】下らねぇ質問はID出して書き込みやがれ 2 (110) TOP カテ一覧 スレ一覧 2ch元 削除依頼
・ 次のスレ
4: DB設計を語るスレ 4 (523)
5: SQL質疑応答スレ 12問目 (477)
8: MySQL 総合 Part22 (326)
9: 【初心者】オラクルマスター Bronze 3【入門者】 (771)

【MySQL】下らねぇ質問はID出して書き込みやがれ 2


1 :11/11/27 〜 最終レス :12/01/26
質問者はまず>>1を良く読むこと(必須!)
過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。
◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
 (荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。

2 :
テンプレは随時追加予定

3 :
1乙

4 :
前スレくらい貼れよ

5 :
多分前レスなんてないんだろうな
スレたてした1の事情は分かった気がする

6 :
>>5
分かってもらえてよかったです。
多分、思ってる通りだと思いますw

7 :
で、質問していいのか?

8 :
PHPスレのパクリ?

9 :
もう一つのMySQLスレが荒れて機能してないからな
パクリってか避難ってことでいんじゃね?

10 :
おっさんをここに誘導して来るよ

11 :
SNSの個人設定で、以下のような日記の公開範囲設定があります。
※「○月○日の日記を公開するかどうか」ではなく、そのユーザーの日記全体の設定です。
5.インターネット全体に公開
4.SNSユーザー全員に公開
3.友達の友達にまで公開
2.友達にだけ公開
1.非公開
ここで、特定のサイト訪問者が閲覧できる日記だけを、記事単位で最新10件分取得したい場合、
どのようなSQLを書くのがスマートでしょうか。
いまは、最初に上記の公開範囲テーブルから「閲覧できるユーザーID」を全取得して、
日記を select するときに where user_id in(1,2,3,5,6,8,9,10,11,13,...) などとやってて、
パフォーマンスがだいぶ悪いです。
そこで、手段を変えて、次のようにひとつのクエリで取得しようとしたら、もっと悪化しました。
where
(private.diary = 5) or
(private.diary = 4 and ログインしてるかどうか) or
(private.diary = 3 and 友達の友達かどうかのサブクエリ) or
(private.diary = 2 and 友達かどうか) or
(private.diary = 1 and 自分かどうか)

12 :
>>11
日記なら、更新頻度そんなに高くないだろうからキャッシュしちゃえば?
10〜20分しても問題ないと思うけど

13 :
検索エンジンGoogleで「インターネットテレビ 朝鮮総連 少頭劣一族 マイクロソフト社(又は経済産業省等気になる省やインターネットや原発、地震 波動砲)」を検索。
警察と自衛隊の武器は少頭劣一族が奪い、朝鮮に送ったらしい。知能障害以前の頭が悪い家族達。「工作員」の意味を知らない「工作員」家族。

14 :
「俺の全文検索」のソースをアップロードした。
http://www.ne.jp/asahi/sun/patagonia/fulltext/fulltext.html
うまく全文検索できないときには掲示板に書きこんでくれ。

15 :
宣伝乙

16 :
w

17 :
VMwareにubuntuをインストールし、そこでmysql 5.1.58使ってます。
ホスト側スペック:win7 / i7:3.4GHz / memory:16GB
ゲスト側スペック:ubuntu 11.10 / CPU core: 4cores / memory:8GB
my.cnfは標準キャラクターセットをutf8に変更した以外には何もいじっていません。
この状態で、8000万レコードのデータ(カラム1(主キー): bigint / カラム2: double)を
200万レコードづつ40分割し、load local infileを用いて下記のテーブルに入れたところ、読み込みに40時間かかりました。
create table ExpRecord(
__ID bigint,
__frequency double,
__primary key(ID)
)
ENGINE=InnoDB
partition by hash(ID)
partitions 100;
少しでも高速化させたく、my.cnfのチューニングをしたいと考えています。
ネット上で適当に見つけたmy.cnfを使ったところ、テーブルへのデータの読み込みがさらに遅くなりました。
(既存のログファイルは削除しています)
また、チューニングについて書かれた複数のブログを参考に、標準のmy.cnfにInnoDB系の行を追加したところ、
今度はデータの登録そのものが出来なくなりました。
チューニングの方法や、ubuntu向けのmy.cnfのチューニングについて解説しているサイト、
DBのチューニングについて参考になるサイトなどありましたらご教示願います。

18 :
>>17
100パーティションにしたらデフォルトのtable_open_cache = 64だと足りない。
1レコードINSERTするごとにopen/closeが走って悲惨なことになる。
パーティショニングをやめたほうがいいと思うけど、さしあたり
table_open_cache = 5000
innodb_buffer_pool_size = 4g
innodb_log_file_size = 512m
innodb_flush_log_at_trx_commit = 2
ぐらいでどう。
innodb_log_file_sizeを変更すると起動しなくなるがそこはググって。

19 :
>>18
ありがとうございます。今までは全く動かなかったのですが、
動くようになり、また速度も約2倍に向上しました。

20 :
質問です。
以下のようなSQLファイルを作成し、実行してみました。
---------------------------------
~$ cat hoge.sql
use test;
drop table if exists table_abc;
create table table_abc(id int primary key, name text, delete_flg int);
insert into table_abc values (1, 'aaa', NULL);
insert into table_abc values (2, 'bbb', 1);
insert into table_abc values (3, 'ccc', 0);
select * from test.table_abc where delete_flg != 1;
---------------------------------
結果は、以下のようになったのですが、delete_flg=NULLのレコードが返却されないのはなぜでしょうか。
~$ cat hoge.sql | mysql
---------------------------------
id name delete_flg
3 ccc 0
---------------------------------

21 :
以下のようなDBがあります。
ID str time
3 123 102828
4 321 103020
5 123 103520
6 123 103530
ここで現在時刻(&time)を10:30:00としたとき
select from テーブル where time >$time
とすると実行結果は、ID4〜6を表示します。
これだと、strの中身(123)がかぶってしまっているとき、
最新の情報だけ抜き出すことはできますでしょうか。
理想の結果は、
ID4とID6が表示されることです。
どなたかわかる方よろしくお願い致します。

22 :
>>21
group by と max
http://toro.2ch.net/test/read.cgi/db/1316769778/4
↑あたりが参考にならんかの?

23 :
>>22
ありがとうございます。
無事やることはできました。
ただ、where time >$time
をどこにいれればよいのでしょうか。

24 :
>>20
SQLの仕様。MySQL以外のDBMSでも同じ。
mysql> select * from table_abc where delete_flg != 1 or delete_flg is null;
+----+------+------------+
| id | name | delete_flg |
+----+------+------------+
| 1 | aaa | NULL |
| 3 | ccc | 0 |
+----+------+------------+
2 rows in set (0.00 sec)
このへん参照
http://www.geocities.jp/mickindex/database/db_getout_null.html

25 :
>>22
正解
>>23
間違っています

26 :
>>24
ありがとうございます。null撲滅委員会のページはとても参考になりました。

27 :
( ´Д`)y━・~~

28 :
( ´,_ゝ`)プッ

29 :
( ´Д`)y━・~~

30 :
( ´,_ゝ`)プッ

31 :
>>30
なんやお前、ここでもワシに喧嘩売る気か?( ´Д`)y━・~~

32 :
( ´Д`)y━・~~

33 :
MySQL 総合スレは終了したの?

34 :
このスレ消費するか

35 :
>>33
消滅したみたいやでw
>>34
どういう意味で使っとるんや?
まさか下手なワシの猿芝居しとるんちゃうやろな
( ´ー`)y-~~

36 :
( ´Д`)y━・~~

37 :
>>36
そういうつまらんレスせんでええから(爆笑)
そうやってワシの真似せーへんとなんも抵抗でけへんの?( ´ー`)y-~~
つくづく光線卒のIT下請けドカタはアホなんやなぁって思いました(爆笑)

38 :
( ´,_ゝ`)プッ

39 :
【再掲】
一月半ほど前
130 名前:NAME IS NULL[] 投稿日:2011/11/06(日) 10:09:44.37 ID:VrwJXmAE [1/10]
超初心者なんだが、SQLってなにに使うの?全くメリットが伝わらん。データベースでなにすんのさ?
Excelでいいよなきがしてならんのだが
現在
ワシが聞いたんは定性的に説明してみぃという問いかけやった、
http://toro.2ch.net/test/read.cgi/db/1318935267/
誘導します。本スレ立った模様です。こちらへどうぞ
http://toro.2ch.net/test/read.cgi/db/1325079058/

40 :
>>38
池沼レス野郎がキタ━━━━━━━━m9( ゚∀゚)━━━━━━━━!!
お前はホンマド底辺の光線卒なんやなw

41 :
>>39
お、できとるんかw
ほなちょっくら覗いてみるわ( ´ー`)y-~~

42 :
予約語がカラム名に使われてるデータベースがあります。
以下のようにすると、参照できることはわかりました。
select * from table_name where 'show' like 'hoge';
ですが、これだと予約語ではないカラム名の場合検索できません。
select * from table_name where column_name like 'hoge';
で帰ってくる結果が
select * from table_name where 'column_name' like 'hoge';
では帰ってこなくなります。
どういうsql文ならカラム名が予約語、予約語ではない場合の両方で使えるでしょうか?
sql文はphpから発行しています。

43 :
>>42
ここの連中は物事何も知らんから諦めとき( ´ー`)y-~~

44 :
>>42
名前は、とにかくバッククオート(`hoge`)で囲んでおけば、
予約語だろうがそうで無かろうが使えるはずだけどね。
(クオート('hoge')ではない)
予約語でなければ囲まなくとも支障は無いが。

45 :
yyyyMMddHHmmssXXという形式の値を入れる、uniqueなカラムがあります。
yyyyMMddHHmmssはインサート時刻、XXは連番で00〜99です。
1秒間に100行までしかインサートできないという仕様です。
このテーブルにインサートするとき、XXの部分を決めるには
どういう処理が一般的でしょうか?
(テーブルはInnoDBです)
1.lock writeして、select count(*)で既存の行数を求める。
2.とりあえずXX=00でインサートして、unique違反になったらXX+=1してリトライ(成功するまでループ)
気になっているのは
1→パフォーマンス低下。万一のデッドロック。auto_commit=falseでトランザクションを
つかって、さらに他のテーブルも更新しているので、ロックとトランザクションの関係
がちょっと複雑。
2→このカラムに依存して値が決まるカラムBが存在するため、一度
インサートした後カラムBだけアップデートしなければならない。
実際は、1秒間にインサートするのはたいてい1回、最大で10回くらいと
想定しています。
ご意見をお聞かせいただければ幸いです。

46 :
yyyyMMddHHmmss 部分はホストプログラムで生成してるのかな?

47 :
ホストプログラムを考えてましたが、DB生成でも大丈夫と思います。

48 :
あ、でもやっぱりホストプログラムでお願いします。

49 :
なら、
・YYYYからXXまで全部ホストプログラムで生成
・XX の部分は連番で
・秒が変わればゼロリセット(ホストプログラムでなら容易)
でいけそうに思えるんだが。
そういうことするプログラム(プロセス)が複数でないならばだけど。

50 :
プロセスは複数なんです。PHPで。

51 :
秒が変わってもXXの連番が必ずしも00から始まらなくても良いなら、
採番テーブルから採番して、その番号を100で割った余りをXXとする。
どうしても00から始まって欲しいなら、採番テーブルにdatetimeのカラムを
設けて、それで秒替わりを検出したら番号をゼロとしてしまう。

52 :
秒間100件程度ならMyISAMで採番テーブル作るで何の問題もないよ。
アベンドしたときに番号の抜けを出したくないとかいうならInnoDBでもいいと思う。

53 :
ホストプログラムが複数マシンで動いていて、システム時刻が
ずれていたりすると問題にならない?

54 :
皆様,お助けください。p_blog というディスコンとなったcmsソフトを使い
続けています。
apache 2.2.17, php 5.3.5, mysql 5.1.57
というバージョンまでは「データベース全体のバックアップ・リストア」で
問題が生じたことはありませんでした(4系列から5系列への移行時を除く)
が,
apache 2.2.21, php 5.3.8, mysql 5.5.16
では,バックアップ・リストアは出来るものの,ブログ本文部分が「全く出
力されない」のです。ここだけ,ゴソッと抜け落ちてしまいます。ブログ本
文が収められているテーブルはちゃんとリストアされていますし,バック
アップ・リストアの際にもエラーは何一つ発生していません。文字コードは
全部UTF-8に統一してあり(status; で確認済み),php.ini, my.cnf の
設定も同じです。
何か,この不具合を解消するための,ヒントを頂戴できませんでしょうか?

55 :
>>53
日時も採番用ホストのそれを使えばいいだけじゃんか。

56 :
皆様ありがとうございます。
まとめると、採番テーブルでDBサーバの時刻を使ったほうが問題が
少ないということで、こんな感じですよね?
create table seq (
id int not null,
dt datetime
);
update seq set id=if(dt<now(),0,id+1),dt=(dt<now(),now(),dt);

57 :
create table seq (
id int not null,
dt datetime
) engine=MyISAM;
update seq set id = last_insert_id( if(dt<now(),0,id+1) ), dt = if(dt<now(),now(),dt);
select last_insert_id(), dt from seq;

58 :
それだとupdateとselectの間にdtが変わってるかもしれないからロック必要じゃね?

59 :
phpで
$query = mysql_query("SELECT * FROM question_tb WHERE purchase_date >='$sdate' AND purchase_date <='$edate' AND star>=4 ORDER BY purchase_date");
これでpurchase_dateが$sdate以上、purchase_dateが$edate以下、star>=4
の3つの条件でmysqlで問い合わせできますが、
別の書き方、
$sql = 'SELECT question_id,purchase_date,purchase_price,star,
lang_php,lang_perl,lang_java,lang_cs,lang_cpp,lang_basic,
job,entry_date
FROM question_tb
WHERE purchase_date >= "' . $sdate . '"
AND purchase_date <= "' . $edate . '"';
ではどのようにstarが4以上を書くのですか?

60 :
>>59
phpで質問したほうがいいっす
>AND purchase_date <= "' . $edate . '"';
AND purchase_date <= "' . $edate . '" AND star >= 4 ORDER BY purchase_date'
ヒアドキュメントにするとわかりやすい・・かも
BETWEENにするとわかりやすい・・かも
$sql = <<<EOT
SELECT question_id,purchase_date,purchase_price,star,
lang_php,lang_perl,lang_java,lang_cs,lang_cpp,lang_basic,
job,entry_date
FROM question_tb
WHERE purchase_date BETWEEN '{$sdate}' AND '{$edate}'
AND star >= 4
ORDER BY purchase_date
EOT;

61 :
すまぬセミコロン抜け
AND purchase_date <= "' . $edate . '" AND star >= 4 ORDER BY purchase_date'

AND purchase_date <= "' . $edate . '" AND star >= 4 ORDER BY purchase_date';

62 :
mysqlを使っていて、AとBというカラムがあって、基本的にはAでソートするのですが、
AがnullのときにBでソートするようにしたいのですが、どうしたらいいのでしょうか?
obder by A,Bにすると、Aがnullのものが先に出るようになります。
AがnullならBの値を使って、AとBを合わせたようなソートを行いたいです。

63 :
>>62
ORDER BY IFNULL(A, B) は?

64 :
>>63
ありがとうございます、解決しました。

65 :
ストアドの引数に配列渡すのってどうするのが良いんでしようか?
テンポラリテーブル作って渡してるのですが、どうにもすっきりしなくて。

66 :
>>60
>>61
ありがとうございました。ヒアドキュメントの方が何故がエラーで
動きません

67 :
テキストをデータベースに格納する場合、普通にINSERTとかするとそのまま格納されると思います
これを圧縮して格納するような事は出来るのでしょうか?
もし出来るとしたら、どのような技術とか手法を行えばいいのでしょうか?

68 :
zip圧縮とかの事言ってんだったら、バイナリだからカラムはBlobでだとか?

69 :
株取引のデータがcsv形式であって、これを検索したりして分析したいと思っているんですけど、
MySQLを使えばいいんでしょうか?
データベースは初めてなので初心者向きのがいいです。

70 :
>>69
そうです。

71 :
>>70
thx

72 :
>>69
MySQLで、銘柄情報テーブルやら株価テーブルやら作ってるyo

73 :
log
name buy inputdate
1.yamamoto 20 2011-12-8
2.takahashi 10 2011-12-7
3.yamamoto 10 2011-12-3
4.hayashi 5 2011-12-1
このようなテーブルがあった場合。
select from log where name ='yamamoto' group by DATE_FORMAT(inputdate,"%Y%M");
このとき最新のもの(1行目)を選んだり最古のもの(3行目)を選んだりできるようにしたいです。
要はgroupby で抽出される行を選択するということなのですが、
having byですと、group by抽出後のものに対する文みたいですし、
なにかいい方法はありますでしょうか?

74 :
>>73
order by inputdate (desc) limit 1 じゃダメなの?

75 :
>>74
ありがとうございます。
ですが、実際にはこのようなレコードが過去の月の分もあります。
そうなると、一行ではなくて、
結果は
yamamoto 20 2011-12
yamamoto 30 2011-11
yamamoto 5 2011-10
.
.
.
みたいに何月分も抽出したい感じなのです。

76 :
>>75
Oracleの場合rank()関数を使ってやる内容。
MySQLの場合はユーザ変数を使ったrank()の再現をする。
かなりめんどくさいけどこんな感じ。
set @r := 0;
select * from
(select @r := @r + 1 rank, e2.* from
(select job, count(*) from emp group by job order by count(*)
) e2
) e3 where rank = 2;

77 :
基礎からのMySQLという本を読んで、学習中です。
302ページのファイルエクスポートのところなのですが、
SELECT * INTO OUTFILE 'C:/data/out.csv' FIELDS TERMINATED BY ',' FROM tb1;
とすると
「Can't create/write to file 'C:\data\out.csv'(Errcode:2)」というエラーがでます。
これはパーミッションの問題ですか? Windows XPを使っています。

78 :
>>77
perrorというコマンドでエラーの詳細が取れる。
> perror 2
OS error code 2: No such file or directory
Win32 error code 2: 指定されたファイルが見つかりません。

79 :
>>78
perrorというのは、コマンドプロンプトでやるんですね。
いただいたヒントをもとにdataというフォルダーを作ってもう一度やってみたら
できました!ありがとうございました。
mysqlでファイルのエクスポートはできるけど、フォルダーの作成まではできないと
理解していいでしょうか?

80 :
そういう操作はしない。into outfile で同名のファイルが有ったら消すということをせずエラーで終了するし

81 :
うむ

82 :
>>80-81
ありがとうございました。

83 :
安藤優子、木村太郎は、某プロパイダの社外取締役、かつ、安藤は、フジ社外の人間にもかかわらず、フジテレビジョンのM&Aの最中、フジのホワイトナ
イトの【親会社】の本業を無視して、「インターネットは虚業だ。具体性がない
。」というようなことをコメントしました。この虚業は、livedoorを指していた
としても、「同業者」であったということは、非常に、違和感を感じずには、い
られません。

84 :
原発の監視システムが止まった件
オラクルのせいにされてるぞ
http://www.ustream.tv/recorded/19694240

85 :
十数年前、オラクルの箱を見たとき書いてあったけどなぁ。
原発制御等、不調に見舞われるととても重篤な結果をもたらすことに使っちゃ駄目です
みたいなことを。

86 :
CMS seezooのプログラムを解析してたら
$sql =
'SELECT '
. 'sz_blog_id, '
. 'entry_date '
.'FROM '
. 'sz_blog '
.'WHERE '
. 'entry_date >= ? '
.'AND '
. 'entry_date < ? '
.'AND '
. 'is_public = 1 '
;
というクエリがmodelに書きこまれてたのですが、
なぜ、こんなにも連結だらけにしてあるのかと、
クエリ中の?は何を意味するのでしょうか。

87 :
クエリにあるクエスチョンの意味分かりました。
フレームワークcodeigniterの記述ルールみたいです。

88 :
連結が多いのは単に
そういうコーディングルールにしてるってだけだと思うよ

89 :
Mysqlにインデックスってあるじゃないですか。
あれって、たとえば京都市に住む男性の田中さんを検索しようとしたとき、
京都市の人口146万人からさがすところを
"性別"というカラムにインデックスがつけてあったら
京都市の男性人口70万人から
検索されてはやくなるということですか?

90 :
>>89
性別ならそうだね
名前にインデックスをつければ、大雑把にいうと名前のあいうえお順で探してくれる
普通なら登録順に探す
本の後ろの索引みたいなものだね

91 :
>>90
>名前にインデックスをつければ、大雑把にいうと名前のあいうえお順で探してくれる
?

92 :
性別はBTreeインデックスだと意味ないな。
使わないほうが速い。

93 :
「埼玉県の田中太郎さん(31)」を探すときに、
50音順版の名簿があれば「た」のあたりに目星を付けて探すだろ?
都道府県順版の名簿なら、埼玉県のあたりから探し始められる。
年齢順版の名簿なら、31歳に絞って探せる。
以下略

94 :
>>93
よく聞く、ツリー式というのは、
31歳に絞る(年齢カラム) → 男性に絞る(性カラム) → 埼玉に絞る(地域カラム)
と、どんどん消去法みたいな感じで絞っていく感じですね。
容疑者の絞り込みみたいな感じですね。
死亡推定時刻はどうか → その時刻にいた人物は → その人物のアリバイは → 

95 :
>>94
ちょっと違うかな
インデックスはカラムごとにつけるから名前のインデックスだったら一文字目、その一文字目に属する中で二文字目っていうツリーができて素早く検索できる

96 :
現在 何万件とレコードのデータがあります。
データが復活できるよう、レコードを消す時は
DELETE ではなく、 表示フラグが false になるという処理をしてます。
やっぱ、このままいくと 重くなっていきますか?

97 :
そらそうでしょ。

98 :
>>97
そらそうですか・・・。
ということは、パフォーマンスをもとめるなら
SQLに残しておけるレコード数には限界があるということですね・・・。

99 :
1番軽いのはデータが0件の状態

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
・ 次のスレ
4: DB設計を語るスレ 4 (523)
5: SQL質疑応答スレ 12問目 (477)
8: MySQL 総合 Part22 (326)
9: 【初心者】オラクルマスター Bronze 3【入門者】 (771)