質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

3回答

193閲覧

クエリ1回で必要なレコードを取得したい

Linkey

総合スコア77

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2018/03/01 14:19

編集2018/03/01 14:22

以下のような図書館での貸出状況の履歴を管理しているテーブルがあります。
イメージ説明

このテーブルを使って以下の情報を取得したいです。
「ノルウェーの森と1Q84を借りたことがある人が誰か」

現在行っている操作手順:

①ノルウェーの森を借りた履歴を抽出する
SELECT * FROM library_history WHERE on_loan = 'ノルウェーの森';
クエリ実行結果

イメージ説明

②抽出結果から1Q84を借りたことがある人物を特定する
SELECT * FROM library_history WHERE name IN('川野美香','田中太郎','武藤武夫','鈴木里佳子') AND on_loan = '1Q84';
実行結果:
イメージ説明

この2つの手順を1つのクエリで実行できないでしょうか?

例に出したのは9件ほどですが、これが数十万件となると確認をするのに時間がかかってしまいます。

このデータベースを検索する前から誰がノルウェーの森を借りたことがあるかは特定できないためon_loanが検索の鍵となります。

内部結合(INNER JOIN)や相関問い合わせ(EXISTS)を使えばできそうと思い試しているのですが期待通りの結果が得られません。効率よく検索ができることがベストですが、調査用のクエリのため、性能は求めておりません。

データベースが得意な方、SQL文に強い方がいましたらご回答いただけないでしょうか?
ちなみにDBはMySQLです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

SQL

1SELECT * FROM library_history 2WHERE name IN ( 3 select name from library_history where on_loan = 'ノルウェーの森' 4 ) 5 and name IN ( 6 select name from library_history where on_loan = '1Q84' 7 )

または

SQL

1SELECT * FROM library_history t1 2WHERE Exists( 3 select 1 from library_history where name=t1.name and on_loan='ノルウェーの森' 4 ) 5 and Exists( 6 select 1 from library_history where name=t1.name and on_loan = '1Q84' 7 )

投稿2018/03/01 15:05

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Linkey

2018/03/07 15:11

回答ありがとうございます
guest

0

ベストアンサー

この手の質問でテキストデータで例示がないのは致命的

簡易的に書き換えてこうです

  • 元データ

SQL

1create table tbl(id int unique,uid int,on_loan varchar(20)); 2insert into tbl values 3(1,1001,'book1'), 4(2,1002,'book1'), 5(3,1003,'book2'), 6(4,1004,'book3'), 7(5,1005,'book1'), 8(6,1002,'book4'), 9(7,1005,'book5'), 10(8,1001,'book4'), 11(9,1004,'book1');
  • 抽出

SQL

1select uid from tbl where on_loan in('book1','book4') group by uid having count(distinct on_loan)=2;

投稿2018/03/02 01:23

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/03/02 06:25 編集

同じ書籍を複数回借りたときに駄目な気がします。 あ、disitinct でしたね。失礼しました。
yambejp

2018/03/02 06:24

countをdistnctで取っているのでユニークな書籍の処理になります
Linkey

2018/03/06 13:57

ありがとうございます
guest

0

SQL

1SELECT * FROM library_history WHERE on_loan IN('ノルウェーの森', '1Q84') AND name IN('川野美香','田中太郎','武藤武夫','鈴木里佳子') ;

通常、書籍マスター、利用者マスターを作るかとは思いますが。

投稿2018/03/01 14:33

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Linkey

2018/03/07 15:12

回答ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問