@souwasora (takei souwa)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

sql join

解決したいこと

違うテーブルから持ってきて統合させたい
celebritiesからは名前と国
countrylanguagesからは言語
ジョニー・デップさんなら、国はUSA、言語はEnglishと表示させたい。
このように表示させたい
image.png

発生している問題・エラー

出ているエラーメッセージを入力

例)

SELECT celebrities.name,language,celebrities.country_code FROM celebrities LEFT JOIN countrylanguages ON celebrities.country_code = countrylanguages.country_code LEFT JOIN celebrities AS name ON celebrities.country_code = celebrities.name;

image.png

celebritiesテーブル
image.png

countrylanguagesテーブル
image.png

該当するソースコード

ソースコードを入力

例)

SELECT celebrities.name,language,celebrities.country_code FROM celebrities
LEFT JOIN countrylanguages 
ON celebrities.country_code = countrylanguages.country_code
LEFT JOIN celebrities AS name
ON celebrities.country_code = celebrities.name

自分で試したこと

いろいろ試しましたが、解決できませんでした。おそらく、languageが悪いのか?と思いながら、試していますが、ダメでした。解決策を教えてください。

0 likes

2Answer

前提として
SELECT celebrities.name,languageの時点で
countrylanguages.languageのように
テーブル名を明記してない、記載カラムの順序が揃っていない…等、
お作法的な話で既に問題はありますが…

想定していない結果になっている原因を述べると、phpMyadmin上で
現在の選択には、ユニークなカラムが含まれていません。という警告が
出ている通りかと思われます。

まず、ON celebrities.country_code = countrylanguages.country_code
結合しようとした時に、countrylanguagesテーブルのcountry_codeカラムが一意ではないので
重複しているカラムが全て結合後、出力されています。

噛み砕いて説明すると…(長文ご容赦ください)
以下(1)、(2)のデータがあるとします。(例:Johnny Depp)
(1) celebritiesテーブルに名前が「Johnny Depp」
  国コードが「USA」のデータ(下記、図.1を参照)

図.1 celebritiesテーブル

name country_code
Johnny Depp USA

(2) countrylanguagesテーブルに国コードが「USA」で言語が「Chinese」のデータ、
  国コードが「USA」で言語が「English」のデータ…等、
  国コードが同じで言語が複数種類あるデータ(下記、図.2を参照)

図.2 countrylanguagesテーブル

country_code language
USA Chinese
USA English
USA French
USA German

この時、(1)と(2)を国コードで結合しようとすると、国コードが「USA」というだけで
言語が「Chinese」なのか「English」なのか、
はたまた別の言語なのか判別できませんよね。

そのため、国コードが「USA」という条件に合致した情報が全て出力されます。
なので、各人物が言語ごとに列挙される、という状態になっています。
パッと見で「USA」が重複しているのが分かるでしょうか。(下記、図.3を参照)

図.3 (1)と(2)が結合されたテーブル

name country_code language
Johnny Depp USA Chinese
Johnny Depp USA English
Johnny Depp USA French
Johnny Depp USA German

(これが、「一意でない」、若しくは「ユニークでない」という状態になります)

そのため「一意」にするための、重複しない情報が必要になります。
(例えば、「国コード」と別に「地域コード」などを用意して、
組み合わせて特定できるようにする。
「国コード」を「言語」毎に「00001」、「00002」など詳細に分け、重複を避ける等)

(countrylanguagesテーブルのFRAとUSAが
どうなっているのか画像からは分からないのであくまで推測ですが)

上記はあくまで方針ですので、
どのような設計にするかはご自身でお考えください。

また、ON celebrities.country_code = celebrities.name
で国コードと人物名が一致していることを条件に結合しようとしているようですが、
何を想定してこの条件にしているのか不明です。

補足ですが、
質問の際にはDBのER図もあれば親切かと思います。

もしよろしければ、以下サイトの
「左外部結合(LEFT OUTER JOIN)」の章を確認してみてはいかがでしょうか。

2Like

テーブル設計が分からないのと、何がダメとおっしゃっているのか分からないですが。
これでは問題があるのでしょうか?

SELECT
  celebrities.name,
  celebrities.country_code,
  countrylanguages.language
FROM
  celebrities
  LEFT JOIN countrylanguages ON celebrities.country_code = countrylanguages.country_code
0Like

Comments

  1. @souwasora

    Questioner

    @blue32a様
    「解決したいこと」に写真追加しました。
    課題があり、解決しようとしています。
  2. 察するに、名前に対して言語が複数表示されるのを問題にされているのだと思いますが、
    それは1つの国コードに複数の言語があるからです。
    USAの言語は写っていませんが、おそらくそれも複数あるのでジョニー・デップさんの行が複数できあがるのでしょう。

    これはデータを取得するSQLの問題というより、データ定義や設計の問題です。
    例えば「有名人は一つの国に属し、1つの言語を話す」のであれば、そのように設計する必要があります。

Your answer might help someone💌