SQL質疑応答スレ 10問目 at DB
[2ch|▼Menu]
335:NAME IS NULL
10/07/27 17:38:55
品目 日付
-------------------------------
酢だこ 7/20
酢だこ 6/20
まだこ 7/21
まだこ 7/1
まだこ 6/25
大だこ 7/1
いか 6/20

こんな感じのテーブルがあり、品目名に"だこ"を含むデータを出現頻度の高い順に取り出そうとしていますが、
select 品目,日付 from table where 品目 in (select 品目 from table 品目 like '%だこ%' group by 品目 order by count(品目) desc;
で、やってみたのですが、遅すぎて使えませんでした。

何かいいやり方は無いでしょうか? お願い致します。

336:NAME IS NULL
10/07/27 18:50:49
like は前方一致じゃないとインデックスを使えない。
「○○だこ」のパターンがあらかじめ全部分かっていれば
 where 品目 in ('酢だこ','まだこ','大だこ')
などにすればインデックス(があれば)使ってくれるはず。

337:NAME IS NULL
10/07/27 18:59:14
>>335
いまいち何がやりたいかわからんな
select 品目,count(*) as 件数 from table where 品目 like '%だこ%'
group by 品目 order by count(*) desc
とかじゃダメなのか?

338:NAME IS NULL
10/07/27 20:41:43
個人的に気になったんで調べてみたけど
今どきはどのDBMSも無償オプションなり何なりで
全文検索機能提供してるのね。
日本語全文検索がどの程度使い物になるかは
やってみないと分からんけど。

339:NAME IS NULL
10/07/27 21:03:06
>>335
この手の検索を今だけ刹那的に行うのか、定型作業として頻繁に
行うのかわからないけど、後者であれば普通にカテゴリを管理した
マスタ表を用意するのが無難かと。

品目  カテゴリ
==========
酢だこ  たこ
まだこ  たこ
大だこ  たこ
たこ   たこ
いたこ  ひと
いか   いか
はまぐり かい
やきぐり くり


340:NAME IS NULL
10/07/27 23:14:51
>>335
品目の重複が多いのなら、HAVINGが早いかも。

SELECT T1.* FROM Table AS T1 JOIN
(SELECT 品目,count(品目) AS cnt FROM Table GROUP BY 品目 HAVING 品目 like '%だこ%') AS T1
USING(品目)
ORDER BY cnt DESC;

341:NAME IS NULL
10/07/27 23:16:09
>>340
2行目の(サブクエリ) AS T1 は AS T2の間違い。
スマソ。

342:NAME IS NULL
10/07/27 23:43:56
mysqlです。
レコードの削除処理でlimitを使用した残りを全て削除するようなSQLはどのように記述すればいいでしょうか


343:NAME IS NULL
10/07/27 23:56:42
EXCEPTでぐぐるといいことがあるかもしれんよ

344:NAME IS NULL
10/07/28 00:25:12
MySQLでEXCEPT使えるようになったっけ?

>>335のデータで最新日付3件を残して他を削除
DELETE FROM Table AS T1 WHERE 3< (SELECT count(*) FROM Table T2 WHERE T1.日付 < T2.日付);
でも、3件目の7/1が2件あるから、4件残ってしまう。
そもそもこれもMySQLで動くかどうかも不明。

345:342
10/07/28 23:11:05
>>343
mysqlに打ちのめされました

346:NAME IS NULL
10/07/29 17:52:57 VSFhFikc
はじめまして
データベースの勉強中です(基本情報技術者試験)

SQLの問題で 選択と射影の違いをよく問われます

・選択 条件に合った行を抽出
・射影 特定の列を抽出

(例)
表 syain(syanid,syainmei,age)

例1 select * from syain where age >= 20
(syain表から、ageが20以上の行を抽出しているので選択)

例2 select syainmei from syain
(syain表から、syainmeiの列のみ抽出しているので射影)

ということですが 以下の例だと

例3 select syainmei from syain where age >= 20

syainmeiという特定の列を指定して さらに ageが20以上という条件もあります

参考書やネットで調べてみると where条件があれば「選択」という意見と
特定の列を指定していれば「射影」という意見に分かれているようです


例3の場合 選択と射影 どちらと見るべきなのでしょうか?
アドバイスよろしくお願いします


347:NAME IS NULL
10/07/29 23:31:28
>>346
射影は重複も省くからdistinctしなきゃいけないよ。
それをぬきにしても射影や選択は関係演算のプリミティブな単位だから、例3は射影と選択を使っているといえる。

348: [―{}@{}@{}-] NAME IS NULL
10/07/30 02:53:36
デジタル工房です
只今オープン価格中
URLリンク(gekiyasu.issekinicho.com)



349:NAME IS NULL
10/07/30 04:12:28 9Np/J98F
>>346
選択(制限)や射影といった関係代数の演算は算数の足し算引き算
かけ算割り算と一緒で組み合わせて使うことができるんだよ〜

なので正解は「選択してから射影」だね。「射影してから選択」
ではないので要注意。

350:39
10/07/30 07:10:30
「選択」とか「射影」とか初めて聞いた。
勉強になりました。

by 開発技術者歴10年

351:NAME IS NULL
10/07/30 07:21:28
射影って普通、高校の数学で習わないか

352:NAME IS NULL
10/07/30 07:33:40
射精なら・・・

353:NAME IS NULL
10/07/30 08:23:23
>>351
今は大学に行かないと習わない。

354:NAME IS NULL
10/07/30 08:37:25
>>353
顔面蒼白…日本って想像以上にやばくなってんだな

355:346
10/07/31 01:19:24 A1610sXI
>>347
>>349
>>352

ありがとうございました
どっちかである必要はないのですね

すっきりしました


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5164日前に更新/116 KB
担当:undef