のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,604,921人
昨日:no data人
今日:
最近の注目
人気の最安値情報

私的良スレ書庫

不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

元スレMySQL 総合 Part13

mysql スレッド一覧へ / mysql とは? / 携帯版 / dat(gz)で取得 / トップメニュー
スレッド評価: スレッド評価について
みんなの評価 :
タグ : - 1064 + - limit + 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
レスフィルター : (試験中)
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
451 : NAME IS - 2008/03/27(木) 23:40:57 ID:??? (+56,+27,-3)
数値と文字列比べちゃダメでしょ。
452 : NAME IS - 2008/03/27(木) 23:45:22 ID:??? (+6,-29,-8)
とりあえず、
SELECT cast('hoge' as signed);
を実行してみればいいと思うよ。
453 : NAME IS - 2008/03/27(木) 23:51:10 ID:??? (+11,-30,-157)
その場をしのぎたいだけなら、idを文字列にキャストして比較すればいいよ。

SELECT * FROM users WHERE cast(id as char(11)) = 'うんこ';

でもこれだと、idにインデックスが張ってあっても
インデックスが使われないかもしれない。

というか、列にindexとidがあるのがそもそもおかしい。
普通、indexなんて名前付けずに、idにして、
idはnameとかuserとかにして、varcharとかcharにするのが普通じゃないかな。

CREATE TABLE Users (
id int(11) UNSIGNED NOT NULL AUTO_INCREMENT
, user_name char(11) NOT NULL DEFAULT '0'
, pw varchar(40) NOT NULL
, PRIMARY KEY (id)
);
454 : NAME IS - 2008/03/28(金) 10:38:32 ID:??? (+7,-29,-152)
>>451
数値に対して文字列で比較しても、そもそも型自体が異なるので絶対合致しないもの、と思っておりました。
しかし何故か0のものが抽出されてしまった為、疑問に思いました。

>>452
実行してみました。0が返ってきました。
要するに、数値型のカラムに対して文字列で比較しようとすると、
mysql内部で自動的に cast('hoge' as signed) のような形に変換され、
その結果返ってきた0で抽出条件を掛けてしまう、という事でしょうか?

>>453
ありがとうございます。
期待した通りの結果が返ってきました。
>indexとidがあるのがそもそもおかしい
こちら当方も感じました(他の方が作ったものの修正をしています)。
あと、CREATE TABLE で主キーに UNSIGNED を付ける辺り、なるほどと思いました。
大変勉強になりました、ありがとうございます。
455 : NAME IS - 2008/03/28(金) 12:57:05 ID:??? (+3,-21,-51)
MySQLのコマンドラインツール(mysql.exe)のログを取る方法はありませんか?
一度に大量のSQLスクリプトを実行するとログが流れてしまって、
エラーが出ていても気づかないということがあるんです。
456 : NAME IS - 2008/03/28(金) 13:01:59 ID:??? (+3,-28,-17)
リダイレクトしてファイルに落とせば?
457 : NAME IS - 2008/03/28(金) 13:07:56 ID:??? (+3,-29,-73)
>要するに、数値型のカラムに対して文字列で比較しようとすると、
>mysql内部で自動的に cast('hoge' as signed) のような形に変換され、
>その結果返ってきた0で抽出条件を掛けてしまう、という事でしょうか?

型が違うと、いちど失敗してから変換が発生するから、
明示的に変換するのに比べてオーバーヘッドが発生することだけ頭の片隅にでも置いておけば、
その理解で大体OK
458 : NAME IS - 2008/03/28(金) 13:52:28 ID:??? (-1,-30,-34)
>>456
mysql -u username -p database < hoge.sql 1>>log.txt 2>>err.txt
でいけました!ありがとうございました。
459 : NAME IS - 2008/03/28(金) 14:14:57 ID:??? (+9,-29,-73)
http://www.mysql.gr.jp/frame/modules/bwiki/?FAQ
あなたが使用している PHP, MySQL のライブラリ(libmysql.dll, libmysqlclient)
の標準キャラクターセットは何かご存じですか?

とありますが、標準キャラクターセットを調べる方法はあるのでしょうか?
460 : NAME IS - 2008/03/28(金) 15:19:09 ID:??? (+3,-30,-98)
正規表現の置き換えはできますでしょうか?
イメージとしては以下のような感じです。

hogeテーブル(id=1)のnameに'A([0-9]+)'があった場合、
(SELECT rep FROM rep_table WHERE id=$1)
と置き換える
A1の場合だと(SELECT rep FROM rep_table WHERE id=A1)

よろしくお願いします。
461 : NAME IS - 2008/03/28(金) 15:40:00 ID:??? (+9,-30,-68)
正規表現使いたいときも確かにあるが、
その例の場合単に第一正規化されてないだけじゃ?
idを分割すればそういうのも簡単に実現できるだろ。

SELECT rep FROM rep_table R
WHERE EXISTS (
SELECT * FROM hoge H WHERE H.kind = 'A' AND H.id = R.id)
AND R.kind = 'A';

みたいな。
462 : NAME IS - 2008/03/28(金) 15:56:00 ID:??? (+4,-30,-109)
>>461さん
レスありがとうございます。

hoge.nameにはA1A3...見たいな感じでA([0-9]+)に複数マッチする可能性があります。(1つもマッチしない場合もあります)
それらすべてを(SELECT rep FROM rep_table WHERE id=$1)の形でとりたいのです。
現状ではプログラム側で、マッチした場合、そのつどSELECTで取得しています。
preg_replace_callback('/A([0-9]+)/','_preg_rep',$query);
function _preg_rep($matches) {
$sql =
"SELECT rep FROM rep_table WHERE id='$matches[1]'";
..
}
わかりづらい質問ですみませんがよろしくお願いします。
463 : NAME IS - 2008/03/28(金) 16:01:21 ID:??? (+62,+29,-54)
意図が伝わらなかったかな。
要は、テーブル定義(というか設計)見直せば?ってこと。
正規表現を使わなくても、テーブルさえちゃんとしてれば
461で示したSQLで実現できるよね?

もし変更が不可能だとしても、
idから部分文字列を切り出すとかすれば十分実現可能。
464 : NAME IS - 2008/03/28(金) 16:04:00 ID:??? (+54,+26,-60)
どうしても正規表現が使いたいなら、
http://dev.mysql.com/doc/refman/5.1/ja/regexp.html
ここを参考にすればいい。
でも、正規表現はそこそこ重い処理だから、
RDBMSでは極力使わないほうがいい。
465 : NAME IS - 2008/03/28(金) 17:53:51 ID:??? (+4,-30,-101)
>>459
PHPでmysqldに接続して(mysqld側の起動オプションで、charset絡みを何も指定せずに)
show variables like '%char%' ;

で、clientとconnectのところ。
466 : NAME IS - 2008/03/28(金) 20:02:50 ID:t4tLBd+a (-21,-18,+1)
>>455
tee
467 : NAME IS - 2008/03/28(金) 22:31:08 ID:??? (-4,-29,-8)
>>466
tee log.txt でコンソールに表示されるログがすべて記録されるんですね。ありがとうございます。
468 : NAME IS - 2008/03/29(土) 00:05:43 ID:??? (-1,-29,-9)
% mysql hogehoge | tee log.txt
469 : NAME IS - 2008/03/29(土) 12:17:05 ID:??? (-1,-29,-10)
% mysql hogehoge | tee -a log.txt
470 : NAME IS - 2008/03/29(土) 23:35:55 ID:3fgyplCn (+9,+19,+0)
471 : NAME IS - 2008/03/31(月) 05:40:50 ID:0Cxuk5my (+33,+29,-95)
同一テーブルをサブクエリでselectしてdelete出来ないので
テンポラリテーブルを使おうと思いますが、
テンポラリテーブルを削除する前に
何らかの形で操作側のプロセスが死んだ場合、
テンポラリテーブルだらけになるんじゃないかと思うのですが、
そのあたりはどうなってるのでしょうか?
472 : NAME IS - 2008/03/31(月) 11:24:38 ID:??? (+2,-29,-9)
>>471
 接続が終了するとDROPされるから問題ないんじゃね?
http://dev.mysql.com/doc/refman/5.1/ja/create-table.html
475 : NAME IS - 2008/04/01(火) 10:38:18 ID:??? (-7,-30,-61)
>>473
show variables like 'tmpdir';
デフォルトは確か /tmp
作られるのは最適化されていないクエリを発行した場合
476 : NAME IS - 2008/04/01(火) 10:40:09 ID:??? (-2,-29,-5)
>>475
mysqlというよりかは、DBIの問題じゃね?
477 : NAME IS - 2008/04/01(火) 10:40:47 ID:??? (+41,+24,-11)
↑ おっと、>>474 へのレスだ
478 : NAME IS - 2008/04/01(火) 11:16:33 ID:??? (-7,-29,-7)
>>474
DBD::mysqlのバージョンが違うからたぶんそれだな。
バージョン合わせるわけにはいかんの?
480 : NAME IS - 2008/04/01(火) 16:12:32 ID:??? (+3,-29,-48)
perl/php などのスクリプトに接続IDとパスを書いて
そのmysql、この場合はlocalhostみたいだから鯖にphp置いてそこから
接続にいく感じ
ftpはそういうスクリプトを上げるときにつかうけど
mysqlにつかうときはバックアップを取るときくらいか
481 : 使ってるのはPy - 2008/04/01(火) 19:10:39 ID:??? (+63,+30,-263)
ここでいいのかよくわかりませんが、疑問・質問等のスレッドがなかったのでここに書きます。使っているのはMySQLなのでここに書きますがデーターベース全般についてです。

ユーザー
+名前
+役割(役割テーブル)
役割
+名前
+説明

のように作る場合に役割を別のテーブルとして定義するとします、これは理解できるのですが。


+住所
住所
+都道府県
+市町村とかそれ以外

のようにデーターベースでは分けるでしょうか?
Pythonのようなオブジェクト指向言語で組み立てれば「駅」オブジェクトは「住所」インスタンスを持つことになると思うので、このようなテーブル構造を思いついたのですが「駅」には固有の「住所」しか当てはまらないので別テーブルにする利点が無い。
「住所」なんてテーブルだと「家」というテーブルを作ったときにこのテーブルからも「住所」を参照することになって「住所」テーブルには「駅」「家」二つのテーブルの住所が記録されることになって美しくない。このような場合どのようにするのがベストでしょうか?
乱文・長文で失礼いたしました、気に触ったらスルーしてください。
482 : NAME IS - 2008/04/01(火) 19:48:45 ID:??? (+94,+29,-59)
とりあえず、リレーショナル理論とか正規化について勉強すれば?
RDBMSとかSQLは、オブジェクト指向だとか、
手続き型だとかとは全然違うことがわかると思う。
483 : NAME IS - 2008/04/01(火) 20:36:08 ID:??? (+75,+29,-31)
>482
ここまでオブジェクト指向とにていると、どうしてもそれで考えてしまいますorz
おっしゃるとおり、やはりデーターベースの考え方をしっかり学んだほうがいいようですねorz
http://www.oreilly.co.jp/books/database/
のものを読んでみようと思います。ありがとうございました。

485 : NAME IS - 2008/04/01(火) 22:21:36 ID:??? (+52,+29,-1)
そこでなぜ引用符をつける。
487 : NAME IS - 2008/04/01(火) 22:30:35 ID:??? (+3,-30,-66)
SELECT hoge FROM Nanika WHERE test BETWEEN 100 AND 1000;

SELECT N1.hoge FROM Nanika N1
WHERE N1.test NOT IN (
SELECT N2.test FROM Nanika N2
WHERE 100 AND 1000
);

・・・ごめんなさい。

SELECT hoge FROM Nanika WHERE test < 100 OR test > 1000;
488 : 484 - 2008/04/01(火) 22:47:34 ID:??? (-2,-30,-12)
すみません、単純に
test NOT BETWEEN '100' AND '1000'

で、目的の結果を得ることが出来ました。お騒がせしました。
489 : NAME IS - 2008/04/02(水) 11:15:13 ID:??? (-6,-30,-198)
>>486
ChangeLogのこれかな。

2003-06-22 Rudy Lippan <rlippan@remotelinux.com> (2.9002)
* Changed the default behaviour of mysql_found_rows, so now
'UPDATE table set field=?' will return the number of rows matched
and not the number of rows physically changed. You can get the old
behaviour back by adding "mysql_found_rows=0" to the dsn passed
to connect.
490 : NAME IS - 2008/04/03(木) 16:45:12 ID:??? (+18,-29,-29)
mysqlをインストールして適当にデータを入れてみたのですが、このデータをhtml上に呼び出すのってどうすればいいのでしょうか?
491 : NAME IS - 2008/04/03(木) 16:47:14 ID:??? (+47,+29,-13)
これまた大味な
492 : 490 - 2008/04/03(木) 16:54:27 ID:??? (+56,+28,-16)
SQLでselectしてデータを取り出すというのは分かるのですが、それをどうやったらページ上に表示できるのかなぁと
javascriptみたいにhtml上に直接かけるわけでもないですし
493 : NAME IS - 2008/04/03(木) 17:03:12 ID:??? (+31,-29,-3)
PHP、CGI、JSP、ASP、ASP.NET
さぁ、好きなのをお選び。
494 : NAME IS - 2008/04/03(木) 17:07:39 ID:??? (+17,-12,-28)
>>493
MySQLからSQLでデータを取り出し、それからさらにPHPなどでHTMLに渡すという事でしょうか?
めんどくさいですね・・・
495 : 490 - 2008/04/03(木) 17:13:13 ID:??? (+19,-8,-16)
phpを使う場合はphpの中にSQLを書く事ができるんですね
496 : NAME IS - 2008/04/03(木) 17:14:52 ID:??? (+57,+29,-7)
他でも一緒だよ
とりあえず、これ以上はスレ違い、というより板違いな気が
497 : NAME IS - 2008/04/03(木) 17:32:17 ID:??? (+56,+28,-14)
それが面倒だと思うなら、Flashから直接SQLサーバと通信してください。
サーバ系は一切必要なくなりますよ。

http://asql.mooska.pl/
498 : NAME IS - 2008/04/03(木) 23:08:13 ID:??? (+18,-20,-54)
SQLでデータベースからデータをselectした後、そこからさらにデータを絞り込む事はできますか?
具体的に言いますと、抜き出したデータの5行目~10行目だけを選択するという感じなのですが、可能でしょうか?
499 : NAME IS - 2008/04/03(木) 23:20:23 ID:??? (+50,+2,+0)
可能です
500 : NAME IS - 2008/04/03(木) 23:38:14 ID:??? (+74,+21,-2)
>>499
それってSQLだけで可能ですか?
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / mysql スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : - 1064 + - limit + 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

類似してるかもしれないスレッド


トップメニューへ / →のくす牧場書庫について