MySQL SQL質問応答スレ [無断転載禁止]©2ch.net
RDBMSごとにスレが分かれていないので答えようがない質問ばかりなので独立させました。
SQL質疑応答スレ 17問目 [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/db/1468157341/ >>50
それで1つのレコードを指し示す名前が80個にもなるの?
リンゴの例だと想像つかないけど >>56
了解です
結局 or 羅列方式で進行中ですが…
>>57
アドバイスありがとうございます今後検討してみたいと思います
>>59
りんごの例ですとせいぜい数個なのですが
食品名って地方によって呼び名が変わったり
別名があったり
それぞれひらがなカタカナ漢字の組み合わせがあったりで
余裕を持って80にしてみたのです
登録中ですけど今のところ最大で20個くらいですが… >>60
なるほど、じゃ正式名称として使うものは元のテーブルにも残しつつ
>>57が書いてるような別名用のテーブルを用意するのがよさそう >>61
別に専用テーブルを設けるのが一番美しいと言うか普通なのかな
ひとつで管理の方が簡単かなとも思ったんですけどRDBってくらいだし面白そうだし
ちょっと本気で検討してみます
つか別の案件が急に入ってしまって(何とdelphi案件!)少し寝かしておいてまた質問等ありましたらよろしくお願いします。
delphiはくだすれがあったような遠い記憶… 「名前」「メールアドレス」など、多数の文字列が入らないカラムの場合、
データ型はtextで良いですかね?それともvarcharで指定するべきですか? そのフィールドを頻繁に検索するならvarcharの方がいいんじゃね?
稀に使う程度ならどっちでもいいけど RFCの規定だと、全体の最大長は256文字だそうだ >>65
like検索はしますが、=検索はしないという想定です。
指定したほうが検索が早いのはわかるのですが、
それ以外にメリットありますかね?
(文字数制限はアプリ側でするとして >>67
5.7系の場合はtemp tableが必要になった場合の速度が違う
8.0系の場合はTempTableエンジン使っていれば性能的な差は気にしなくてもいいけど
Postgresと違ってMySQLのtext型は掲示板のレスのような長い可変文字列を格納する型として定着してるので
メールアドレスや名前みたいなのに使うと他の人が見ると混乱する
DBのデータ型でも簡単に文字数制限できるのに
それをアプリだけでやるというのは良くない設計 実際に格納されている文字列長分の領域しか使っていない、事前に領域を確保していない、使わなくなった領域は穴埋めで再利用されると思うのは、データベースエンジニアでもいるくらいだからなあ。
データの物理位置を常に移動させていたら、とてもじゃないが、使い物にならない速度になってしまう。
なんとなく大きなデータ型を使うのは、アンチパターンどころか、絶対にやってはいけないレベル。 スキーマ名にutf8な日本語が含まれている場合に、mysqldumpでうまくスキーマごとにダンプすることってできますか?エロい人。
Windows版の5.7です。 ローカル環境の8でTEXT型20万行に対しnot in検索かけたらこの世の終わりみたいな音出してたよ マルチバイトを使わない文字列が1カラムあるテーブルがあって
password
Password
PASSWORD
あって、区別するにはBINARYを使うというまではわかったんだけど、
このカラムにプライマリキーやuniqueを設定しようとすると重複してダメと言われるけど、大文字小文字が混在する場合は無理?
1カラムしか無い場合はプライマリーキーとかは設定しなくていいの? プライマリキーを設定するかどうかはcollationとは別の問題 レコード追加する際に、連番のカラムを最大値+1にしたいです。
諸事情で、
・その連番のカラムはAUTO_INCREMENTではない
・プライマリキーでもなければUNIQUEですらない
・テーブル定義は変更してはいけない
という状況で、
重複させないのが要件です。
INSERT INTO unko (renban) SELECT MAX(renban)+1 FROM unko;
として1つのSQLで実行すれば、重複のリスクは回避できるでしょうか?
それとも、トランザクションでテーブル排他ロックからしなきゃだめでしょうか? SQLについて質問なのですが
select USERID,USERNAME from USER_GRADE
where
STATUS in (select STATUS from USER_GRADE where GRADE ='Platinum' group by STATUS)
and
GRADE <> 'Platinum'
これをSQL初心者にもわかる簡単な書式に直して同じ結果を出したいのですがわかる方いますでしょうか >>76
トランザクションによる排他制御は必須
それが暗黙的に実行されるか明示的に指定するかの違いがあるだけ
そのケースは分離レベルをserializableにする必要がある
同じSQLステートメントでしか競合しないなら
片方のトランザクションをコミット直前でsleepさせておいて
もう片方のトランザクションをsleepさせずに実行した結果を確認してみるといい すみません、ちょっと筋違いな質問かもしれませんが、
あるソフトウェアはSQLを利用するのですが、それをインストールしようとすると、他のソフトウェアで使われているSQLと競合してインストールできません。
他のソフトウェアはたくさんあるのですが、どれがSQLを使用しているものか調べる方法はありますでしょうか? mysqltunerで
skip-name-resolve=1
これの推奨が出てくるのは、いつもlocalhostと127.0.0.1の変換がパフォーマンスの低下になるからってこと?
ユーザ作る時localhostと手打ちで入力しているけど、
ローカルだけならホストの権限は127.0.0.1に揃えた方が良いと言うこと? MYSQLで
CREATE OR REPLACE TABLEみたいなことってできませんか?
テーブルの作成、もしくはテーブル構成の更新したいのです 検索方法で質問です
例えば「カツカレー」で検索すると
「カレー」のレコードを
「三色エビチリ」で検索すると
「エビチリ」のレコードを得たいのですがいい方法はありますでしょうか
テーブルの方は
カレー 情報…
エビチリ 情報…
オムライス 情報…
となってます >>86
それマスタテーブルの存在がわかってないだけだろ >>86
形態素解析の話?
それとも「カツカレー」という単語を「カレー」にマッピングするテーブルを作る話? >>88
集合演算子で検索したけど
分からなかった
>>89
あ、いえ例えばカレーで検索してカツカレーを求めることはできますけど
正規表現とか使って逆はできないかな
という質問です
マッピングテーブルみたいなの作るしかないのかな >>90
カツカレーの情報が、エビチリ情報テーブルに存在しないデータの持ち方ならSELECT文をUNION ALLで並べればいいだけだろ。
セレクト 列名 カレー情報 where 列名 イコール カツカレー
ユニオンALL
セレクト 列名 エビチリ情報 where 列名
イコール カツカレー
俺は答えを教えるのは本人にとってよくないと思っているから、本当は書きたない。
そもそもそのデータモデリングは自分で考えたのか? UNIONなどの集合演算子は列名が揃ってないと使えないからな >>91
おまえどう考えても勘違いしてるぞ
上塗り重ねず自重しとけ >>90
選択肢はブルートフォース、n-gram、 形態素解析、マッピングテーブルくらいかな
どれを選ぶかは用途次第
ブルートフォースは「カツカレー」というキーワードとテーブルの列名を1件1件比較して
キーワード内の部分文字列が列名に合致するかどうかを判断していく
めちゃ遅くなるけどデータ量と要求速度によってはこれでいい場合もある
n-gramで例えば文字単位で3文字ずつのまとまり(trigram)に分解すれば
「カツカレー」は「カツカ」「ツカレ」「カレー」の3つになる
この3つのキーワードともとの単語でテーブルを検索して合致するものがあるかどうか見る
形態素解析はそれ用のライブラリ使って
「カツカレー」を「カツ」と「カレー」という単語単位に分解して検索する
マッピングテーブルは
「カツカレー」というキーをマスタテーブルの「カレー」にマッピング
「カツ」にマッピングしたりする可能性もあるから1対多 動的に列名違いのSQLを組み立てるなんてありえない。 >>95 >>96
SQLで出来ないことが分かっただけでも収穫ですが
さらに解決のヒントをいただきありがとうございます
ブルートフォースって言うのですか
PHPで作ってますがロジックで判断するやり方はちらっと頭に浮かんだのですが
性能がめちゃ心配で脳内却下してました
n-gramはちょっと分かりませんでした
形態素は解析エンジンを信用しきれなくて…
というわけで力作業でマッピングテーブルを作るか
それかブルートフォースでやるか
検討したいと思います >>97
SQLでというか>>95の選択肢はどれもストアドやUDF使えばDB側でできるよ
特にブルートフォースでやるならDB側でやったほうが性能的には断然いい >>99
ストアドとかUDFとか知らなかった
教えてくれてありがとう >>101
MySQLのストアドプロシージャは最悪の仕様だから覚悟しとけ! フライとかが登録されたTestというテーブル作っておいて
whereの中に "エビフライ" ライク コンキャット( パーセントフライパーセント)
みたいな値をかく。このエビフライっていうところが検索文字列ね
これでフライがとれるだろ?こういうことじゃないの? なおSQLで書こうとするとはじかれて書き込めなかった
わかりにくいがすまん 後半のパーセントで囲まれてるフライっていう文字列はテーブルのカラム名がそこにくる それに沿った書き方すれば、'エビフライ'という文字列が与えられていて
項目中に'エビフライ'の部分文字列にマッチするレコードを見つけるという問題
'エビフライ'のどこで区切るかは指定されていない
字句解析を行うか、ブルートフォースで行うか、だろうか
ストアドでやるとすれば、各レコードの項目文字列が'エビフライ'という文字列に
部分マッチングするか検査する感じかな ソースレビューにてDISTINCTは性能劣化するのでGROUP BYに変更しろと言われましたがDISTINCTよりGROUP BYのほうが性能あがるんですか?初心者ですみません。 >>110
DISTINCTのほうが速いこともあればGROUP BYのほうが速いこともある
状況によるので実際のデータとクエリで実行計画の差と所要時間を計測して existsのほうが性能が高い可能性ありますか?3パターンを実測し1番性能が良いのを採用します。 mysqldumpでエクスポートしたらインサート文のテーブル名がすべて空なんだけど原因わかる方教えてください。
mysqlのバージョン
Ver 8.0.32 for Linux on x86_64
コマンド
mysqldump -u {user} -p -h {host} --no-create-info --skip-extended-insert {dbname} {tablename} > export.sql
エクスポート結果
insert into `` (aaa ,bbb, ccc);
insert into `` (aaa ,bbb, ccc);
insert into `` (aaa ,bbb, ccc); https://qiita.com/masayoshi0327/items/19938d1a40023a5ba159
上の真似して
select
case
when name is null or name = '' then 'name'
else name
end as name
case
when idis null or id= '' then 'id'
else id
end as id
from users;
こんな感じでセレクトしてるんだけど、なぜかカラム名まで取れて
1行目
id name
22 山田
みたいな感じの結果が帰ってきてしまう。。
なんでですかね >>114
then ‘name’とかthen ‘id’としてるからだろ スクリプト書くのもめんどくさいから表計算ソフトでやってしまう。 【2月13日】 原発上空にUFO? 【震度6強】
://egg.5ch.net/test/read.cgi/atom/1615255108/l50
kuni toshi
--------
日本 東京
日本 大阪
米国 ロス
米国 シカゴ
中国 北京
中国 上海
↓
kuni toshi
--------
日本 東京、大阪
米国 ロス、シカゴ
中国 北京、上海
初心者質問、ごめんなさい。 上記のようにgroup化したいのですが
SELECT kuni,toshi FROM テーブル名 GROUP BY kuni
では上手いきませんでした、アドバイスをお願いできませんか? >>121
ありがとうございます!
いままで2回にわけてSQL文をつくって無理やりやっていましたが、スマートにできそうです! WHERE IN で入力した順番になりません
SELECT
id,name
FROM table
WHERE id IN (3,2,1)
を流すと
1,2,3に並び替えられてしまいます
入力順のままにする方法はありますでしょうか? 3、2、1の順にしたい場合は、その順にソートするしかない すいません! order by でできるのでしょうか? 入力した順番が判らないと、その通りにはならない
DBへの格納順は指定できない
3,2,1の順が単に大きい順ということなら、order by desc で良い 入力順が、例えば2,1,3だったとしよう
その順に出力したいなら、
select * from table order by field (id , 2,1,3);
この場合も、入力順が 2,1,3 であると言う情報が必要 ORDER BY無しでINSERTされた順に出力される保証なんて無いのでは >入力順のままにする方法はありますでしょうか?
これをどううけとるか、だな SELECT * FROM users;で特定のカラムだけ抽出したくないとかできませんかね?
created_atだけ抽出したくないとか > 彼らはよく、社会に貢献したいと口にする。
> なんでも社会悪のネトウヨを自殺に追い込むことが、社会に貢献することなんだそうで。
> イジメや嫌がらせで社会に貢献できる教師や警官になるために、あえて帰化したんであって、祖国同胞を裏切ったわけではなく、心は●●人なんだそうだ。
>
> 昔は帰化すると裏切り者と呼ばれたりしたが、祖国に国籍を残したまま帰化する方法が確立された現在では、社会に貢献するためにむしろ帰化することが推奨されている。
> 拳銃所持で前科のある生粋の反日家ですら、今では普通に帰化している。
>
> ●●学会などはネトウヨ認定した日本人を盗撮して、痴漢の写真だと言ってばらまいている。
> それらの写真は、集団ストーカーに使用される。
> 彼らは集団ストーカーを、[地域で子供を守る安心安全パトロール]と称している。 なんの脈絡もなく突然こういうこと言い出す人いたら怖い >>139
昔の2ちゃんねるのデマだよ
こういう事実と異なる話で、創価学会員が全員、在日コリアンとかありえない話を信じ込む人間が一定数いる。 SELECT文の作成に困っています
下記のような2つのカラムを同一のものとして集計するヒントを頂けないしょうか?
【アンケートテーブル】
氏名 希望A 希望B
----------------------
Aさん 札幌 仙台
Bさん 大阪 福岡
Cさん 札幌 大阪
Dさん 福岡 札幌
↓
【旅行人気ランキング】
---------------------
札幌(3)
仙台(1)
大阪(2)
福岡(2) >>146
ありがとうございます
UNION で検索したら参考になりそうなサイトが沢山ヒットしました