質問編集履歴

3 中間テーブルという表記を追加

tokumei000

tokumei000 score 17

2020/07/25 14:49  投稿

## 実現したいこと
例えば果物が以下のような複数の特徴を持っており、これを交差テーブルを用いて構築したとします。
* リンゴ(甘い、かたい)
* バナナ(甘い、やわらかい)
* レモン(甘い、すっぱい)
fruit(果物テーブル)
|id|name|price|
|:--|:--:|--:|
|1|リンゴ|100|
|2|バナナ|120|
|3|レモン|130|
characteristic(特徴テーブル)
|id|name|
|:--|:--:|
|1|甘い|
|2|すっぱい|
|3|やわらかい|
|4|かたい|
fruit_characteristic(交差テーブル)
|id|fruit_id|characteristic_id|
|:--|:--:|--:|
|1|1|1|
|2|1|4|
|3|2|1|
|4|2|3|
|5|3|2|
|6|3|3|
このような状況において「甘い」「やわらかい」両方に合致する「バナナ」のみを取り出すことは可能でしょうか?
## 試したこと
条件をorにして検索すると(当たり前ですが)以下のような出力になります。
またandだと複数の値を持つレコードは存在しないため結果は0件になってしまいます。
```sql
select fruit.name, characteristic.name from fruit_characteristic
join fruit on fruit_id = fruit.id
join characteristic on characteristic_id = characteristic.id
where characteristic.name = '甘い'
or characteristic.name = '柔らかい'
```
|name|name|
|:--|:--:|
|リンゴ|甘い|
|バナナ|甘い|
|バナナ|やわらかい|
|レモン|やわらかい|
orを用いて検索した結果を、受け取った側でなんらかの処理をして両方の特徴を持つバナナのみを取得するという方法はできなくもなさそうですが、SQLで検索する段階で複数の条件に合致する値のみを取得することはできないでしょうか?
よろしくお願いします。
## 追記
回答に投稿した通り自己解決しましたが、他にも良い方法や補足等があれば知りたいと思いますのでしばらく回答受付中にしておきます。
よろしくお願いします。
  • SQLite

    1433 questions

    SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

  • SQL

    5820 questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • データベース

    2944 questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

2 追記を追加。

tokumei000

tokumei000 score 17

2020/07/24 20:46  投稿

交差テーブルを用いてDBを構築したときに、複数の特徴に合致する値を取り出したい。
## 実現したいこと
交差テーブルを用いてDBを構築したときに、複数の特徴に合致する値を取り出したいと考えています。
例えば果物が以下のような複数の特徴を持っており、これを交差テーブルを用いて構築したとします。
* リンゴ(甘い、かたい)
* バナナ(甘い、やわらかい)
* レモン(甘い、すっぱい)
fruit(果物テーブル)
|id|name|price|
|:--|:--:|--:|
|1|リンゴ|100|
|2|バナナ|120|
|3|レモン|130|
characteristic(特徴テーブル)
|id|name|
|:--|:--:|
|1|甘い|
|2|すっぱい|
|3|やわらかい|
|4|かたい|
fruit_characteristic(交差テーブル)
|id|fruit_id|characteristic_id|
|:--|:--:|--:|
|1|1|1|
|2|1|4|
|3|2|1|
|4|2|3|
|5|3|2|
|6|3|3|
このような状況において「甘い」「やわらかい」両方に合致する「バナナ」のみを取り出すことは可能でしょうか?
## 試したこと
条件をorにして検索すると(当たり前ですが)以下のような出力になります。
またandだと複数の値を持つレコードは存在しないため結果は0件になってしまいます。
```sql
select fruit.name, characteristic.name from fruit_characteristic
join fruit on fruit_id = fruit.id
join characteristic on characteristic_id = characteristic.id
where characteristic.name = '甘い'
or characteristic.name = '柔らかい'
```
|name|name|
|:--|:--:|
|リンゴ|甘い|
|バナナ|甘い|
|バナナ|やわらかい|
|レモン|やわらかい|
orを用いて検索した結果を、受け取った側でなんらかの処理をして両方の特徴を持つバナナのみを取得するという方法はできなくもなさそうですが、SQLで検索する段階で複数の条件に合致する値のみを取得することはできないでしょうか?
よろしくお願いします。  
 
## 追記  
回答に投稿した通り自己解決しましたが、他にも良い方法や補足等があれば知りたいと思いますのでしばらく回答受付中にしておきます。  
よろしくお願いします。
  • SQLite

    1433 questions

    SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

  • SQL

    5820 questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • データベース

    2944 questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

1 sql文のミスを修正

tokumei000

tokumei000 score 17

2020/07/24 20:26  投稿

交差テーブルを用いてDBを構築したときに、複数の特徴に合致する値を取り出したい。
## 実現したいこと
交差テーブルを用いてDBを構築したときに、複数の特徴に合致する値を取り出したいと考えています。
例えば果物が以下のような複数の特徴を持っており、これを交差テーブルを用いて構築したとします。
* リンゴ(甘い、かたい)
* バナナ(甘い、やわらかい)
* レモン(甘い、すっぱい)
fruit(果物テーブル)
|id|name|price|
|:--|:--:|--:|
|1|リンゴ|100|
|2|バナナ|120|
|3|レモン|130|
characteristic(特徴テーブル)
|id|name|
|:--|:--:|
|1|甘い|
|2|すっぱい|
|3|やわらかい|
|4|かたい|
fruit_characteristic(交差テーブル)
|id|fruit_id|characteristic_id|
|:--|:--:|--:|
|1|1|1|
|2|1|4|
|3|2|1|
|4|2|3|
|5|3|2|
|6|3|3|
このような状況において「甘い」「やわらかい」両方に合致する「バナナ」のみを取り出すことは可能でしょうか?
## 試したこと
条件をorにして検索すると(当たり前ですが)以下のような出力になります。
またandだと複数の値を持つレコードは存在しないため結果は0件になってしまいます。
```sql
select fruit.name, characteristic.name from fruit_characteristic
join fruit on fruit_id = fruit.id
join characteristic on characteristic_id = characteristic.id
where characteristic.name = '甘い'
or where characteristic.name = '柔らかい'
or characteristic.name = '柔らかい'
```
|name|name|
|:--|:--:|
|リンゴ|甘い|
|バナナ|甘い|
|バナナ|やわらかい|
|レモン|やわらかい|
orを用いて検索した結果を、受け取った側でなんらかの処理をして両方の特徴を持つバナナのみを取得するという方法はできなくもなさそうですが、SQLで検索する段階で複数の条件に合致する値のみを取得することはできないでしょうか?
よろしくお願いします。
  • SQLite

    1433 questions

    SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

  • SQL

    5820 questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • データベース

    2944 questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る