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

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

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

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

Q&A

解決済

3回答

18147閲覧

MySQL 特定のカラムの重複を避けてLEFT JOINで結合したい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

0グッド

0クリップ

投稿2020/06/27 06:15

編集2020/06/27 07:25

MySQL 特定のカラムの重複を避けてLEFT JOINで結合したいです。

結合したいテーブルは以下の二つです。

animal

1+----+-------------+----------+-----+ 2| id | Jananese | English | age | 3+----+-------------+----------+-----+ 4| 1 | 犬 | dog | 4 | 5| 2 | 猿 | monkey | 8 | 6| 3 | 猫 | cat | 1 | 7| 4 | 鳥 | bird | 2 | 8| 5 | ライオン | lion | 9 | 9+----+-------------+----------+-----+

staff

1+----+------------+-------------+------+ 2| id | animal_id | staff_no | sex | 3+----+------------+-------------+------+ 4| 1 | 1 | ueno_001 | M | 5| 2 | 2 | ueno_002 | F | 6| 3 | 1 | ueno_003 | M | 7| 4 | 3 | ueno_004 | F | 8| 5 | 3 | ueno_004 | F | 9+----+------------+-------------+------+

そして、以下のようなLEFT JOINを使って以下のような結果を求めています。

求める表示結果 +----+------------+----------+----------+ | id | staff_no | Jananese | English | +----+------------+----------+----------+ | 1 | ueno_001 | 犬 | dog | | 2 | ueno_002 | 猿 | monkey | | 3 | ueno_003 | 犬 | dog | | 4 | ueno_004 | 猫 | cat | +----+------------+------- --+----------+

ですが、staff_numberの部分の重複を避けたいのですが、うまくできません。
現在のコードを出力結果は以下の通りです。

現在のコード SELECT animal.id, staff_no, Jaopanese, English FROM staff LEFT JOIN animal ON staff.animal_id = animal.id ;
現在の結果 +----+------------+-------------+----------+ | id | staff_no | Jananese | English | +----+------------+-------------+----------+ | 1 | ueno_001 | 犬 | dog | | 2 | ueno_002 | 猿 | monkey | | 3 | ueno_003 | 犬 | dog | | 4 | ueno_004 | 猫 | cat | | 5 | ueno_004 | 猫 | cat | +----+------------+-------------+----------+

staff_noのカラムの値の重複をさけ、ueno_004の表示を見本のように一回にしたいです。
distinctなども使ってみたのですが、うまく行きませんでした。
特定のカラムのみ重複を避けるにはどうしたら良いでしょうか?
アドバイスお願いいたします。

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

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

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

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

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

YT0014

2020/06/27 06:53

staffテーブルで、同一staff_noで、別animal_idだった場合、どういう結果を想定されていますか? 例えば、以下の場合とか | id | animal_id | staff_no | sex | | 6 | 1 | ueno_005 | F | | 7 | 2 | ueno_005 | M |
退会済みユーザー

退会済みユーザー

2020/06/27 07:03

ありがとうございます。正直なところ、求める結果の表示にとらわれ、同一staff_noで、別animal_idの場合を想定していなかったです。 同一staff_noで、別animal_idだった場合は、staff_noが二回表示されるようにしたいと思います。 各ナンバーのスタッフがお世話する動物が表示され、かつ、上から順に1,2,3,4...と、一番左のIDカラムに順に番号が割りふられるイメージです、
shun-K

2020/06/27 07:14

なんか不思議なテーブル設計ですね。 animal=飼育している動物、staff=飼育員 ということでしょうか? 飼育員「ueno_004」は男性なのですか、女性なのですか?
退会済みユーザー

退会済みユーザー

2020/06/27 07:24

私のテーブル設計に問題がありました・・すみません。 「ueno_004」のsexをFに統一しました。 性別の設定はあまり意味はなく、LEFT JOINを使って、id | staff_no | Jananese | English  のカラムを結合するという意図飲みで作ったテーブルでした。そのため、設定としてよくないテーブルになってしまいました。すみません。
guest

回答3

0

staffテーブルに問題があります
id=4,5が同じデータです、
特定のanimal_idに対しておなじstaff_noを割り当ててはだめです。
普通はstaffテーブルに対してanial_idとstaff_noの複合カラムでユニーク属性をつけて
このような重複が入力できないようにします

またstaff_no単体で重複を許すのであればsexカラムは正規化して別テーブルで管理します

投稿2020/06/27 13:51

yambejp

総合スコア114572

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

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

退会済みユーザー

退会済みユーザー

2020/06/28 06:31

ありがとうございます。ユニーク属性をつけるなど、データの重複を避ける方法について、理解できました。
guest

0

提示されている仕様の場合、完全に同一な行だけ除外すれば良いので、DISTINCT を追加しましょう。

SQL

1SELECT DISTINCT 2 animal.id, staff_no, Jaopanese, English 3 FROM staff 4 LEFT JOIN animal 5 ON staff.animal_id = animal.id ;

MySQL select文仕様

投稿2020/06/27 07:10

編集2020/06/27 07:33
YT0014

総合スコア1708

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

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

退会済みユーザー

退会済みユーザー

2020/06/27 07:28

ありがとうございます。DISTINCTを追加しても、表示結果は変わりませんでした。一番左側idのカラムが同一でないため、ueno_004は二回表示されてしまいます。もし、一番左のカラムにidを表示しなければ、DISTINCTは有効なのですが、左側にidは残したいため、つまづいています。
YT0014

2020/06/27 07:35

ご提示いただいたSQLとその結果ですが、正しい組み合わせではないのではないでしょうか? SQLの最初のカラムは、animal.idなので、結果は、上から、2,1,2,3,3となると思うのですが。
guest

0

ベストアンサー

staffはスタッフさんのマスタテーブルかと思いきや
animalの担当テーブルみたいにも見えるのがちょっとまずい点
「ueno_004」さんは…性別がFとM両方ある…オカマかな?
animalの性別だとしたらanimalにsex列を設けるべきだし多分staffの性別なんでしょう。
animalの雄と雌で担当を区別する目的かとも思ったんですがanimalにageがあるので…(思考停止)

とりあえずSQL

sql

1SELECT min(animal.id) as id, staff_no, Jananese , English 2 FROM staff 3 LEFT JOIN animal 4 ON staff.animal_id = animal.id ; 5GROUP BY staff_no, Jananese , English

まあこうすれば求める結果にはなります。ただidの5を捨てる基準がわからない。
staffのid=5の列のanimal_idが3以外だったらどうするつもりなんでしょう。

投稿2020/06/27 07:07

sousuke

総合スコア3828

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

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

退会済みユーザー

退会済みユーザー

2020/06/27 07:33

私のテーブル設計に問題がありました・・すみません。 「ueno_004」のsexをFに統一しました。(オカマではありません・・) 年齢や性別の設定はあまり意味はなく、LEFT JOINを使って、id | staff_no | Jananese | English  のカラムを結合するという意図飲みで作ったテーブルでした。そのため、設定としてよくないテーブルになってしまいました。すみません。 idの5を捨てる基準ですが、一番左のカラムのid以外が同一だった場合、重複を避けたいという意図があります。例えば、 | 4 | ueno_004 | 猫 | cat | | 5 | ueno_004 | 猫 | cat | の場合は、 ueno_004 → 猫 が表示されれば良いので、id4と重複するid5の列は表示したくないのです。
sousuke

2020/06/27 12:06

であれば多分提示のSQLでいいです
退会済みユーザー

退会済みユーザー

2020/06/28 06:31

ありがとうございます!!提示していただいたようにやったらできました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問