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

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

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

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

SQL

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

Q&A

解決済

4回答

7604閲覧

INNER JOINをするのと、しないのと、SELECT文の実行後の取得数が変わってしまいます。

qaz3330

総合スコア113

MySQL

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

SQL

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

0グッド

0クリップ

投稿2016/07/20 12:27

初歩的な質問かもしれませんが、
INNER JOINをするのと、しないのと、SELECT文の実行後の取得数が変わってしまいます。

INNER JOINは、JOIN先のテーブルのカラムをWHERE句の条件に追加したいためです。

しかし、次のように取得数が変わってしまい困っております。

ceremonyテーブル

joinしたいのは
categoryテーブル

  1. INNSER JOINをしないでSELECT文を実行

=> 100件

select * from ceremonies;
  1. INNSER JOINをしてSELECT文を実行

=> 300件
※ 重複したレコードも取得してしまっております。

select * from ceremonies INNER JOIN categories ON categories.ceremony_id = ceremony.id;

JOINするのは必須なのですが、あくまで、1) と変わらない結果のままで取得したいのですが、
そういうことはできないのでしょうか?

よろしくおねがいします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

完全に重複しているレコードということなら無理やり行うと、
SELECT DISTINCT~のようにDISTINCTキーワードを利用すると重複は排除できます。

ですがそもそもcategoryを結合してレコードが増えるということは、
結合キーが足りていないとかcategoryのデータ登録状況が問題な気がします。

idだけではcategoryが一意となっていないなどはないでしょうか?

投稿2016/07/20 12:34

編集2016/07/20 12:39
Panzer_vor

総合スコア1636

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

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

0

ceremonyテーブルとcategoryテーブルのレコード数が1:nの関係になっているからではないでしょうか。
caterogryテーブルをceremony_idでグルーピングし、抽出するカラムを限定したものとJOINすれば良いかと思います。

投稿2016/07/21 00:39

ttyp03

総合スコア16996

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

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

0

ceremoniesが100でcategoryにjoinすると300になると言う事は、単純計算して1個あたり3個のレコードが存在すると言う事になります。ceremoniesのidがプライマリした場合、categoryは同じidで3個存在します。

ceremoniesの数でcategoryの情報をjoinで取り出すためには、この3個のどれかのデータを選択する必要が有ります。できればこの辺の情報を頂けるとSQLが書けると思います。

投稿2016/07/20 13:41

編集2016/07/21 12:04
A.Ichi

総合スコア4070

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

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

0

inner joinは=で結ぶ際、基本となるテーブルをどちらを置くかで結果が変わります。
その状態ではcategoriesテーブルを基点に
categoriesテーブルのceremony_idに一致するceremoniesテーブルを検索してしまい
どちらかというと
select * from categoriesに近い結果になります。
ceremoniesを基点としたい場合は
select * from ceremonies INNER JOIN ceremonies ON ceremonies.id = categories.ceremony_id;
とすることでいけるはずです。

ちょっと個人的にinner joinはあまり使わないので怪しければ
select * from ceremonies ce,categories ca WHERE ce.id = ca.ceremony_id;
で期待した結果が取得できると思います。

投稿2016/07/20 12:38

編集2016/07/20 13:58
damalnylpo

総合スコア53

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

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

Panzer_vor

2016/07/20 12:52

LEFT JOINやRIGHT JOINの外部結合は基本とするテーブルで結果は変わりますけど、 INNER JOINの場合は入れ替えても結果は一緒になりませんでしたっけ?
damalnylpo

2016/07/21 10:29 編集

すいません、内容を勘違いしていました。 結果の順番は左を基点に並ぶんですが レコード数も変わっていたんですね。 テーブルの関係は1:多ですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問